Go 슬라이스 때문에 한참 헤맸어요. 슬라이스를 잘라서 새 변수에 담고 거기에 append 했는데, 원본 슬라이스 값까지 같이 바뀌어버려서 버그를 한참 찾았습니다.
대충 이런 상황이었어요.
a := []int{1, 2, 3, 4, 5}
b := a[0:2] // [1 2]
b = append(b, 99) // b는 [1 2 99]
fmt.Println(a) // [1 2 99 4 5] ???
b에만 append 했는데 a의 세 번째 값이 3에서 99로 바뀌어 있더라고요. 처음엔 제가 뭘 잘못 봤나 했는데 계속 재현돼요. 슬라이스가 같은 배열을 공유한다는 얘기를 얼핏 들은 것 같긴 한데, 이게 그거랑 관련 있는 건가요?
그럼 슬라이스를 자를 때마다 이런 문제가 생길 수 있는 거잖아요. 원본을 안 건드리고 독립적으로 복사해서 쓰려면 어떻게 해야 하나요? cap이니 뭐니 하는 것도 관련 있다고 들었는데 이참에 원리까지 좀 알고 싶습니다.