Go 系列教程 —— 11. 数组和切片

Dingo1991 ·
"当新的元素被添加到切片时,会创建一个新的数组。现有数组的元素被复制到这个新数组中,并返回这个新数组的新切片引用。现在新切片的容量是旧切片的两倍。" 关于切片容量变化的,简单测了下,文中所说的翻倍不准确,10楼说的2的倍数也不是。具体可能还是要看底层源码才能搞明白。 a. numNewElement < cap(slice) - len(slice) ,并不会创建新的数组 //追加新元素时,是否创建新的数组要看 追加后的长度是否超过原来切片的容量 testa := [...]string {"a","b","c","d"} tests := testa[1:3] tests = append(tests, "f") //追加未超过原切片的容量,并不会创建新的数组,修改切片仍能对应更改到源数组 tests[0] = "x" fmt.Println("testa:",testa, "tests:", tests) //testa: [a x c f] tests: [x c f] b. cap(slice) - len(slice) < numNewElement < cap(slice) , 和文中所说一致,容量翻倍 c. numNewElement > cap(slice) ,增加的容量跟切片数据类型相关 //追加的元素数据大于原切片的容量时,新切片的容量不是简单的翻倍,也不是10楼所说的2的倍数 //string类型时,容量变化大小是 追加元素的数量 tests := []string{"a","b"} tests = append(tests,"e","f","g") fmt.Println(cap(tests)) //5 //int类型时,容量变化大小是 追加元素的数量的“向上取偶” testi := []int{1,2} testi = append(testi,5,6,7) fmt.Println(cap(testi)) //6 如果要“准确”的认识,还是得看底层实现逻辑
#14
更多评论
一个数组的表示形式为 n[T] 应该是[n]T
#1
polaris
社区,需要你我一同完善!
已修正,感谢反馈!
#2