运行
格式化
停止
分享
赞助
package main import "fmt" func main() { s := []int{4, 5, 3} s2 := s // 因为切片是一个指针 由于是值传递 所以 s2 是 s 的指针地址的副本 fmt.Printf("s -> %p, s -> %p \n", s, s2) s2 = append(s2, 1, 2) // 可以看到 s 和 s2 的地址发生了变化 fmt.Printf("s -> %p, s -> %p \n", s, s2) fmt.Println(s2) fmt.Println(s) // 再来一个例子 s3 := make([]int, 0) fmt.Printf("step 1: s3 -> %p cap -> %d len -> %d %d\n", s3, cap(s3), len(s3), s3) // 为什么第一次 append 地址会变呢?因为 make 初始化时切片的数据是个空的数组,所以需要扩容返回了新的切片 s3 = append(s3, 1) fmt.Printf("step 2: s3 -> %p cap -> %d len -> %d %d\n", s3, cap(s3), len(s3), s3) s3 = append(s3, 2) fmt.Printf("step 3: s3 -> %p cap -> %d len -> %d %d\n", s3, cap(s3), len(s3), s3) s3 = append(s3, 3) fmt.Printf("step 4: s3 -> %p cap -> %d len -> %d %d\n", s3, cap(s3), len(s3), s3) s3 = append(s3, 4) fmt.Printf("step 5: s3 -> %p cap -> %d len -> %d %d\n", s3, cap(s3), len(s3), s3) // 可以看到每次到了需要扩容的时候,就返回了新的切片。具体的扩容策略参考后面译注的煎鱼和stefno的博客 }