package main

import "fmt"

func main() {
	// 1) 创建一个长度、容量都为 3 的切片
	s := make([]int, 3, 3)
	fmt.Printf("初始: len=%d  cap=%d  ptr=%p %p\n", len(s), cap(s), s, &s)

	// 2) 再追加 3 个元素，刚好填满底层数组
	s = append(s, 4, 5, 6)
	fmt.Printf("填满: len=%d  cap=%d  ptr=%p\n", len(s), cap(s), s)

	// 3) 再追加 1 个元素，触发扩容
	//    在 Go1.18+ 的扩容策略中，当元素数量 ≤ 256 时，容量直接翻倍
	s = append(s, 7)
	fmt.Printf("扩容: len=%d  cap=%d  ptr=%p\n", len(s), cap(s), s)

	// 4) 继续追加，观察下一次扩容
	for i := 8; i <= 20; i++ {
		s = append(s, i)
	}
	fmt.Printf("再扩: len=%d  cap=%d  ptr=%p\n", len(s), cap(s), s)

	// 5) 共享底层数组示例
	a := []int{10, 20, 30, 40}
	b := a[1:3] // b 与 a 共享底层数组
	fmt.Printf("共享前 a=%v  b=%v\n", a, b)
	b[0] = 99
	fmt.Printf("共享后 a=%v  b=%v  (修改 b[0] 影响 a)\n", a, b)
}
