Một slice là view gồm (con trỏ, len, cap) trỏ vào một backing array. Nhiều slice có thể share cùng array → sửa qua slice này, slice kia thấy theo.
Điểm bẫy nằm ở append:
- Còn cap dư → append ghi in-place lên array chung, có thể đè phần tử của slice khác.
- Vượt cap → cấp array mới, copy sang, và cắt liên kết với array cũ.
Vì kết quả phụ thuộc cap, bug rất khó lường. Muốn cô lập, dùng copy sang slice mới, hoặc full-slice expression s[a:b:b] để ép cap = len.
go
a := []int{1, 2, 3, 4}
b := a[:2] // share array với a, cap = 4
b = append(b, 99) // còn cap → ghi đè a[2]!
// a == [1 2 99 4]