slice_internals.go 951 B

12345678910111213141516171819202122232425262728293031
  1. package main
  2. import "fmt"
  3. func main() {
  4. // 1) 创建一个长度、容量都为 3 的切片
  5. s := make([]int, 3, 3)
  6. fmt.Printf("初始: len=%d cap=%d ptr=%p %p\n", len(s), cap(s), s, &s)
  7. // 2) 再追加 3 个元素,刚好填满底层数组
  8. s = append(s, 4, 5, 6)
  9. fmt.Printf("填满: len=%d cap=%d ptr=%p\n", len(s), cap(s), s)
  10. // 3) 再追加 1 个元素,触发扩容
  11. // 在 Go1.18+ 的扩容策略中,当元素数量 ≤ 256 时,容量直接翻倍
  12. s = append(s, 7)
  13. fmt.Printf("扩容: len=%d cap=%d ptr=%p\n", len(s), cap(s), s)
  14. // 4) 继续追加,观察下一次扩容
  15. for i := 8; i <= 20; i++ {
  16. s = append(s, i)
  17. }
  18. fmt.Printf("再扩: len=%d cap=%d ptr=%p\n", len(s), cap(s), s)
  19. // 5) 共享底层数组示例
  20. a := []int{10, 20, 30, 40}
  21. b := a[1:3] // b 与 a 共享底层数组
  22. fmt.Printf("共享前 a=%v b=%v\n", a, b)
  23. b[0] = 99
  24. fmt.Printf("共享后 a=%v b=%v (修改 b[0] 影响 a)\n", a, b)
  25. }