Array
array其实就是数组,它的定义方式如下:
var arr [n]type
n代表了数组初始化长度,type表示数组中数据类型,对于数组的操作与c,c++,java语言基本类似,都为访问下标去获得值,且数组定义后不能改变长度,且数组赋值为值赋值即当把一个数组作为参数传入函数的时候,传入的其实是该数组的副本,而不是它的指针。如果要使用指针,那么就需要用到后面介绍的 slice 类型了。
数组声明例子
a := [3]int{1, 2, 3} // 声明了一个长度为3的int数组
b := [10]int{1, 2, 3} // 声明了一个长度为 10 的 int 数组,其中前三个元素初始化为 1、2、3,其它默认为 0
c := [...]int{4, 5, 6} // 可以省略长度而采用 `...` 的方式,Go 会自动根据元素个数来计算长度
另外,go语言当然支持生成二维数组
easyArray := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}
array类型的介绍到此结束,如果有了其他类型的基础,理解array没任何问题。
Slice
很多应用场景下,数组并不能满足我们的需求,因此我们便需要动态数组,也叫作slice
slice 并不是真正意义上的动态数组,而是一个引用类型。slice 总是指向一个底层
动态数组声明例子
//第一种方式,声明slice数组并赋值,初始长度3
slice1 := []int{1, 2, 3}
//第二种方式,声明slice是一个切片,但是没分配空间
var slice2 []int
//第三种方式,声明slice是一个切片并且同时初始化空间
var slice3 []int = make([]int, 3)
//第四种方式(推荐,最简便)
slice4 := make([]int, 3)
slice 可以从另一个slice 中获取,也可以从array中获取,通过切片的方式得到指定内容,如下图所示
// 声明一个含有 10 个元素元素类型为 byte 的数组
var ar = [10]byte {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}
// 声明两个含有 byte 的 slice
var a, b []byte
a = ar[2:5]
// 现在 a 含有的元素: ar[2]、ar[3]和ar[4]
b = ar[3:5]
// b 的元素是:ar[3] 和 ar[4]
另外现在slice的追加截取也是经常使用的东西
//向一个容量满的地方追加,cap自动增加到原本两倍,如果一次添加超过两倍,便不再翻倍
numbers = append(numbers, 1, 3, 5, 7)
需要注意的是slice 是引用类型,所以当引用改变其中元素的值时,其它的所有引用都会改变该值。
从概念上面来说 slice 像一个结构体,这个结构体包含了三个元素:
1.一个指针,指向数组中 slice 指定的开始位置
2.长度,即 slice 的长度
3.最大长度,也就是 slice 开始位置到数组的最后位置的长度
可以从图中看到若slice是截取某数组的内容,它只是指向了这个数组的部分内容,如果数组内的值改变,slice里面的值也改变