Go
Posted 安然_随心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go相关的知识,希望对你有一定的参考价值。
参考地址:
https://blog.golang.org/slices
https://blog.golang.org/strings
1. Go中的 数组,切片
先看结论:
1.1 关于数组
- 对于数组来说,size 是类型的一部分。如下所示,buffer1 与buffer2 就是不同的类型。
buffer1 [256]byte,
buffer2[512]byte 。
- 在存储时,buffer1中就只存储了他的元素值(没有其他的数据,简单的数组)。存储示意如下所示。可以通过索引方式进行访问,如 buffer1[1], buffer1[2]…
buffer1 : byte byte byte ... 256 times ... byte byte byte
- 数组在Go中最重要的用处就是作为slice 的底层存储;另外,对于多维矩阵,使用数组比较方便;
1.2 关于切片
- 切片是一种 数据结构,用于描述 一个底层数据的连续的数据区域。切片不是数组,只是 用于描述数组的一部分。使用上述的buffer1数据来说,构建切片的方式包括:
var slice []byte = buffer[100:150] //前闭后开
- 切片元素的类型和底层数组元素类型一致,因此,构造时,可以省略类型声明,如下:
var slice = buffer[100:150]
或:
slice := buffer[100:150]
- slice变量的底层数据结构的样子是什么呢?可以将它想象为入下的样子(真实的样子还这有点区别)
type sliceHeader struct
Length int
Capacity int
ZerothElement *byte //实际的ZerothElement的类型和 切片元素的类型一致
slice := sliceHeader
Length: 50,
ZerothElement: &buffer[100],
- 另外,也可以从切片中构建切片
slice2 := slice[5:10]
上面的slice2 从slice的slice[5]开始,也就是从buffer的buffer[105]开始,109结束。两个切片同时指向同一个底层数组。
- 切片本身是一个值类型,但是内部包含了一个指针,通过指针引用操作底层数组。当使用slice作为参数传递时,传值方式为值传递,即形参是实参的一个拷贝。虽然切片是一个值类型,但是使用切片作为参数,还是可以修改到底层数组的值(在不发生扩容的情况下)
It’s important to understand that even though a slice contains a pointer, it is itself a value. Under the covers, it is a struct value holding a pointer and a length. It is not a pointer to a struct.
package main
import (
"fmt"
)
func AddOneToEachElement(slice []int)
for i := range slice
slice[i]++
func SubtractOneFromLength(slice []int) []int
slice = slice[0 : len(slice)-1]
return slice
func main()
data := [...]int1, 2, 3, 4, 5
slice := data[:]
AddOneToEachElement(slice)
fmt.Println("%s", slice)
fmt.Println("%s", data)
fmt.Println("Before: len(slice) =", len(slice))
newSlice := SubtractOneFromLength(slice)
fmt.Println("After: len(slice) =", len(slice))
fmt.Println("After: len(newSlice) =", len(newSlice))
输出:
%s [2 3 4 5 6]
%s [2 3 4 5 6]
Before: len(slice) = 5
After: len(slice) = 5
After: len(newSlice) = 4
- 切片的容量等于底层数组的大小。但你将slice的扩大时,最大不能操作底层数组的大小。当index>cap容量时,会导致pannic。如果你想要扩大slice到超出底层数组时,应该怎么做?实际上没有任务办法。你唯一可以做的时,重新申请一个数组,然后把当前内容复制过去。
- make 方法:帮助你快速的创建一个切片。功能:创建一个底层数组,并使用该底层数组,构建切片。
- 使用append方法进行安全的扩充切片。
以上是关于Go的主要内容,如果未能解决你的问题,请参考以下文章