总感觉golang的append设计反人类,不是在一个slice中追加元素,而是生成一个新的slice。正好今天被append坑了一次。作个标记先。
总结来说,append更像一个函数
func append(src []Type, eles... Type) tag []Type {
if cap(src) >= len(src) + len(eles) { // 如容量够填充
// 直接用ele填充src后面的空位
// 返回的tag所用的内存块跟src一致
} else {
// 创造一个更大的新内存块
// 将src的元素复制过来并之后填充eles
// 返回的tag所用的内存块跟src不一致
}
}
测试了一段代码,如下:
a := []int{1,2,3}
b := a[:2]
c := append(b, 9)
fmt.Println("a:", a)
fmt.Println("b:", b)
fmt.Println("c:", c)
// a: [1 2 9]
// b: [1 2]
// c: [1 2 9]
d := make([]int, 2, 2)
e := d[:]
f := append(e, 9)
fmt.Println("d:", d)
fmt.Println("e:", e)
fmt.Println("f:", f)
// d: [0 0]
// e: [0 0]
// f: [0 0 9]
f[0] = 1
fmt.Println("d:", d)
fmt.Println("e:", e)
fmt.Println("f:", f)
// d: [0 0]
// e: [0 0]
// f: [1 0 9]