Go 数组与切片 电脑版发表于:2020/12/13 15:43 ![go数据类型](https://img.tnblog.net/arcimg/hb/0dd243ae49394f12beed84237bfee1a3.jpg "go数据类型") >#Go 数组与切片 [TOC] 数组与其他语言的区别 ------------ >在 Go 中简单的定义 ```go var arr [3]int var arr1 = [3]int{1, 2, 3} ``` >不指定数量的定义 ```go var arr2 = [...]int{1, 2, 3, 4, 5} ``` >二维数组的定义 ```go arr4 := [...][2]int{{1, 3}, {6, 8}} ``` >遍历时 ```go // dex表示下标 for dex, e := range arr2 { t.Log(dex, e) } t.Log("two new func") for _, e1 := range arr4 { t.Log(e1) } ``` >截取数组 ```go // 截取从下标0开始到下标2之前 arr2[0:2] ``` 完整Demo:https://github.com/geektime-geekbang/go_learning/blob/master/code/ch6/array_test/array_test.go 切片 ------------ tn>相当于c#中的span共享内存的方式,下面我们来了解这三个方法 | 方法名 | 意义 | | ------------ | ------------ | | len() | 获取数组或切片数据的长度 | | cap() | 获取切片内存占用大小的长度 | | make | 定义切片的大小与内存的长度 | >切片的定义 ```go t0 := []int{1, 2, 3} // 长度为3,内存占用5 t1 := make([]int, 3, 5) ``` >如何区分 len() 与 cap() 我们举一个简单的例子 ```go func TestSliceGrowing(t *testing.T) { s := []int{} for i := 0; i < 10; i++ { s = append(s, i) t.Log(&s[0], len(s), cap(s)) } } ``` ![](https://img.tnblog.net/arcimg/hb/b7ab6ca049c94dc88bf3483a90890d79.png) tn>其内部结构体,所以append时要重新获取,但当append添加数超过len时,cap会以两倍当形势增长,当cap变化时地址都不一样 >那么当有多个截断操作会怎么样,cap会是多少? ```go func TestSliceShareMemory(t *testing.T) { year := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"} Q2 := year[3:6] t.Log(Q2, len(Q2), cap(Q2)) summer := year[5:8] t.Log(summer, len(summer), cap(summer)) summer[0] = "Unknow" t.Log(Q2) t.Log(year) year = append(year, "None") t.Log(year, len(year), cap(year), &year[0]) t.Log(summer, len(summer), cap(summer), &summer[0]) t.Log(Q2, len(Q2), cap(Q2), &Q2[0]) } ``` >cap大致为多少以下列图作为参考 ![](https://img.tnblog.net/arcimg/hb/e01e440f8a86498f87a882f144b02f3b.png) 结果如下: ![](https://img.tnblog.net/arcimg/hb/3ddde0b2091b4a8d8c63ce4d85775578.png)