슬라이스에 저장해놓은 값을 복사하고 싶은 경우가 있습니다.
단순히 새로운 변수에 대입해서 사용하게 되면 문제가 발생합니다.
이유는 메모리를 참조하고 있는 포인터까지 그대로 복사해오기 때문에, 복사해온 변수 또는 복사한 새로운 변수값을 변경하면 모두 변경이 돼버립니다.
슬라이스 복사하기
단순히 대입을 해서 사용하는 경우는 아래처럼 값이 모두 변경됩니다.
슬라이스 단순 대입 예제
package main
import "fmt"
func main() {
slice := []int{0, 10, 20, 30}
// 슬라이스 변수 slice값을 변수 newslice에 대입
newslice := s
// 값 변경
newslice[0] = 100
fmt.Println(newslice) // [100 10 20 30]
fmt.Println(slice) // [100 10 20 30]
}
변수 newslice 값을 변경했지만 원본 값도 변경되었습니다.
이번에는 copy 함수를 사용해 복사해보겠습니다.
슬라이스 copy 예제
package main
import "fmt"
func main() {
slice := []int{0, 10, 20, 30}
// 새로운 슬라이스를 생성
copyslice := make([]int, len(slice))
// copy 함수로 슬라이스 복사
copy(copyslice, slice)
// 값 변경
copyslice[0] = 100
fmt.Println(copyslice) // [100 10 20 30]
fmt.Println(slice) // [0 10 20 30]
}
copy 함수를 사용해 슬라이스를 복사해 사용하면 어느 한쪽 값을 변경해도 서로 영향이 없습니다.
슬라이스를 복사해야 하는 경우에는 단순 대입이 아닌 copy 함수를 사용해서 만들어야 합니다.
댓글