AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
### append 向原切片末尾添加元素,并返回新的切片对象. ~~~ s := []int{} fmt.Println(s, len(s), cap(s)) s = append(s, 1) s = append(s, 2) fmt.Println(s, len(s), cap(s)) s1 :=[]int{1,2,3} s1 = append(s1,100) fmt.Println(s1) ~~~ ~~~ [] 0 0 [1 2] 2 2 [1 2 3 100] ~~~ ### append扩容特点 函数 append 会智能地处理底层数组的容量增长。在切片的容量小于 1000 个元素时,总是 会成倍地增加容量。一旦元素个数超过 1000,容量的增长因子会设为 1.25,也就是会每次 增加 25%的容量。随着语言的演化,这种增长算法可能会有所改变 ~~~ s := make([]int, 0, 1) fmt.Println(s, len(s), cap(s)) oldCap := cap(s) for i := 0; i < 17; i++ { s = append(s, i) if newCap := cap(s); oldCap < newCap { fmt.Println("当前长度", len(s),"新容量", newCap) } } ~~~ ~~~ [] 0 1 当前长度 2 新容量 2 当前长度 3 新容量 4 当前长度 4 新容量 4 当前长度 5 新容量 8 当前长度 6 新容量 8 当前长度 7 新容量 8 当前长度 8 新容量 8 当前长度 9 新容量 16 当前长度 10 新容量 16 当前长度 11 新容量 16 当前长度 12 新容量 16 当前长度 13 新容量 16 当前长度 14 新容量 16 当前长度 15 新容量 16 当前长度 16 新容量 16 当前长度 17 新容量 32 ~~~ **注意: 使用append向容量也使用了底层数组的切片添加元素也会改变底层数组的值** ~~~ slice := []int{10, 20, 30, 40, 50} newSlice := slice[1:3] fmt.Println(newSlice, len(newSlice), cap(newSlice)) newSlice = append(newSlice, 60) fmt.Println(newSlice, len(newSlice), cap(newSlice)) fmt.Println(slice, len(slice), cap(slice)) ~~~ ~~~ [20 30] 2 4 [20 30 60] 3 4 [10 20 30 60 50] 5 5 ~~~ ### 创建切片时的第三个索引 ~~~ 在创建切片时,还可以使用之前我们没有提及的第三个索引选项。第三个索引可以用来控制新 切片的容量。其目的并不是要增加容量,而是要限制容量。可以看到,允许限制新切片的容量 为底层数组提供了一定的保护,可以更好地控制追加操作. *如果在创建切片时设置切片的容量 和长度一样,就可以强制让新切片的第一个 append 操作创建新的底层数组,与原有的底层数 组分离。新切片与原有的底层数组分离后,可以安全地进行后续修改.* ~~~ ~~~ slice := []int{10, 20, 30, 40, 50} newSlice := slice[1:3:3] fmt.Println(newSlice, len(newSlice), cap(newSlice)) newSlice = append(newSlice, 100) fmt.Println(slice, len(slice), cap(slice)) fmt.Println(newSlice, len(newSlice), cap(newSlice)) ~~~ **因为限制了容量,所以没有对底层数组的元素也进行修改** ~~~ [20 30] 2 2 [10 20 30 40 50] 5 5 [20 30 100] 3 4 ~~~ ### ...运算符 使用...运算符可以将一个切片的所有元素添加到另一个元素当中 ~~~ s1 := []int{10, 20, 30, 40, 50} s2 := []int{90, 100} fmt.Println(append(s1, s2...)) ~~~ ~~~ [10 20 30 40 50 90 100] ~~~ ### copy ~~~ s1 := []int{1, 2, 3} s2 := []int{4, 5, 6, 7, 8, 9} copy(s2, s1) //前面是目标切片 fmt.Println(s2) ~~~ ~~~ [1 2 3 7 8 9] ~~~