Go에서 슬라이스 가변성 이해
Go에서 슬라이스는 연속된 요소 시퀀스를 저장하는 동적인 크기의 변수입니다. 이는 요소가 포함된 기본 배열에 대한 포인터와 길이를 저장하는 헤더 구조를 사용하여 구현됩니다.
다음 코드 조각을 고려하세요.
func someFunc(A []int) int { ... tempA := A // copy the slice by value ... newArr = remove(tempA, i) ... } func remove(slice []int, s int) []int { return append(slice[:s], slice[s+1:]...) }
이 코드에서 추가 함수 tempA 슬라이스를 수정하는 데 사용됩니다. 그러나 someFunc 함수가 반환되면 tempA가 A의 복사본으로 생성되었음에도 불구하고 원본 A 슬라이스도 수정됩니다.
왜 이런 일이 발생합니까?
슬라이스 헤더는 기본 배열과 별도의 데이터 구조입니다. 조각이 복사되면 헤더만 복사되고 기본 배열은 복사되지 않습니다. 이는 원래 A 슬라이스와 새로 생성된 tempA 슬라이스가 모두 동일한 기본 배열을 가리킨다는 것을 의미합니다.
append 함수가 호출되면 새 슬라이스가 생성되고 tempA 슬라이스의 요소가 새로운 슬라이스. 그러나 A 슬라이스는 여전히 수정된 요소를 포함하는 동일한 기본 배열을 가리킵니다.
권장사항
A 슬라이스를 수정할 때 원본 슬라이스의 의도하지 않은 변형을 방지하려면 복사하려면 복사 기능을 사용하여 슬라이스의 전체 복사본을 만들어야 합니다. 복사 기능은 새로운 기본 배열을 생성하고 그 배열에 요소를 복사합니다.
다음은 복사 기능 사용 방법의 예입니다.
tempA := make([]int, len(A)) copy(tempA, A)
이렇게 하면 다음에 대한 새로운 기본 배열이 생성됩니다. tempA를 선택하고 A의 요소를 여기에 복사합니다. tempA에 대한 수정 사항은 원본 A 슬라이스에 영향을 주지 않습니다.
위 내용은 Go 슬라이스를 복사해도 전체 복사가 생성되지 않는 이유는 무엇이며 의도하지 않은 변형을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!