AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## slice Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作\[\]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。 数组和slice之间有着紧密的联系。一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。一个slice由三个部分构成:**指针、长度和容量**。**指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素**。长度对应slice中元素的数目;**长度不能超过容量**,容量一般是从slice的开始位置到底层数据的结尾位置。内置的len和cap函数分别返回slice的长度和容量。 ~~~ s := make([]int, 1, 3) fmt.Println(s) fmt.Printf("%p\n", s) s = append(s, 10) fmt.Println(s) fmt.Printf("%p\n", s) s = append(s, 10) fmt.Println(s) fmt.Printf("%p\n", s) s = append(s, 10) //当扩容后的容量超过已有的底层数组的容量后,引用的底层数组变了 fmt.Println(s) fmt.Printf("%p\n", s) //可以看到底层的地址变了 ~~~ ``` [0] 0xc00000a380 [0 10] 0xc00000a380 [0 10 10] 0xc00000a380 [0 10 10 10] 0xc00000e2a0 ``` 多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠。 ## make 内置的make函数创建一个指定元素类型、长度和容量的slice。容量部分可以省略,在这种情况下,容量将等于长度。 ~~~ make([]T, len) make([]T, len, cap) // same as make([]T, cap)[:len] ~~~ 在底层,make创建了一个匿名的数组变量,然后返回一个slice;**只有通过返回的slice才能引用底层匿名的数组变量**。在第一种语句中,slice是整个数组的view。在第二个语句中,slice只引用了底层数组的前len个元素,但是容量将包含整个的数组。额外的元素是留给未来的增长用的。 ## 注意 1. 应该禁止slice进行==的操作符. 2. 所有的Go语言函数以相同的方式对待nil值的slice和0长度的slice。