Go中的array和slice | Go主题月

307 阅读2分钟

go的数组array

数组是同一类型元素的固定长度的序列。

在go语言中一般不直接使用数组。

go语言中数组的声明:

var a [3]int				// int数组默认为元素为0
var b = [...]int{1, 2, 3}	// 自动推断出数组的长度
var c = [...]int{2:3, 1:2}	// 使用引号,初始化指定位置的值
d := [...]int{1, 2, 4:5, 6}	

多维数组的声明:

arr0 := [2][3]int{{1, 2, 3}, {4, 5, 10}}
arr1 := [...][3]int{{1, 2, 4}, {2, 3, 12}}	// 第二维不能省略

关于array的函数

len(arr) == cap(arr)	// 都是求数组的长度

go的切片slice

和数组对应的数据结构是slice,切片。

切片代表变长的序列。

slice的底层引用了一个array对象。

一个slice由三部分组成,指针,长度和容量。

slice.png

  • 指针指向底层对应的数组,但一定是数组的第一个元素;
  • 长度表示slice中元素的数目;
  • 容量表示最大长度,所以长度不能超过容量。当向slice中添加元素超出cap后,就会重新分配底层数组。

slice的创建

直接声明

s1 := []int{2, 3, 4}	// len和cap都是3
s2 := []int{}			// 空slice

通过一个数组或者另一个slice

arr := [...]int{2, 4, 5, 12, 5}

s1 := arr[0:2]
s2 := arr[:2]
s3 := arr[0:2:6] // [low:high:max]

通过make来创建slice

var s2 []int = make([]int, 2, 5) 	// ptr, len, cap
s3 := make([]int, 2)				// 省略cap

slice的相关操作

操作含义
s[n]返回索引n的元素
s[:]返回索引从0到len(s)-1的切片
s[low:]返回索引从low到len(s)-1的切片
s[:high]返回索引从0到high-1的切片
s[low:high:max]返回索引从low到high-1的切片
len(s)返回切片的长度
cap(s)返回切片的容量

使用append函数追加元素

s := []int{2, 3, 4}
append(s, 1, 2, 3)

当超过slice的容量的时候,会重新分配底层数组

slice的拷贝, copy函数

复制长度以len最小的为准

s1 := []int{2, 3, 4, 5}
s2 := make([]int, 2)
copy(s2, s1)

参考资料

  1. www.topgoer.com 《Go语言中文文档》
  2. chai2010.cn/advanced-go… 《Go语言高级编程》
  3. docs.hacknode.org/gopl-zh/ 《Go语言圣经》