Go 语言之 Array Slice | 青训营

49 阅读3分钟

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 开始位置到数组的最后位置的长度

image.png

可以从图中看到若slice是截取某数组的内容,它只是指向了这个数组的部分内容,如果数组内的值改变,slice里面的值也改变