Go에서 슬라이스 수정 이해
Go에서 슬라이스 변수는 일반적인 배열과 다르게 동작합니다. 이로 인해 특히 슬라이스를 수정할 때 예상치 못한 동작이 발생할 수 있습니다.
원본 슬라이스 변경의 미스터리
다음 코드를 고려하세요.
import "fmt" func main() { A := []int{3, 4, 5, 3, 7} fmt.Println("Initial slice: ", A) funcSome(A) fmt.Println("Modified slice: ", A) } func funcSome(slice []int) { fmt.Println("Inside function, original slice: ", slice) temp := slice // copy by value temp[0] = 10 fmt.Println("Inside function, modified temp: ", temp) fmt.Println("Inside function, original slice: ", slice) }
이 코드를 실행하면 임시 슬라이스 temp를 수정하면 원래 슬라이스 A도 수정된다는 사실에 놀랄 수도 있습니다.
슬라이스 내부 살펴보기
이 동작을 이해하려면 슬라이스의 내부 구조를 자세히 알아볼 필요가 있습니다. 슬라이스 변수는 세 가지 구성 요소로 구성됩니다.
temp := 슬라이스와 마찬가지로 슬라이스를 값으로 새 변수에 할당하면 얕은 복사본이 생성됩니다. 이는 새 슬라이스(임시)가 원래 슬라이스(슬라이스)와 동일한 백업 배열 및 포인터를 공유한다는 것을 의미합니다.
append() 딜레마
append( ) Go의 함수는 새로운 백업 배열을 생성하고 기존 데이터를 복사하여 슬라이스에 요소를 추가합니다. 그러나 새 슬라이스의 용량이 충분하지 않으면 추가() 함수는 더 큰 백업 배열을 재할당하여 자동으로 용량을 늘립니다.
귀하의 예에서 제거() 함수는 추가()를 사용하여 새 슬라이스를 생성합니다. 일부분. temp와 A는 동일한 백업 배열을 공유하므로 새 슬라이스를 수정하면 원본 슬라이스에도 영향을 미칩니다.
결론
Go에서 슬라이스 수정을 이해하려면 다음 내용에 익숙해야 합니다. 독특한 내부 구조. 값별로 슬라이스를 복사하는 경우 동일한 백업 배열을 공유하는 얕은 복사본을 생성한다는 점을 기억하세요. 이 동작은 슬라이스를 수정할 때 예상치 못한 결과를 초래할 수 있습니다.
위 내용은 Go Slice 사본을 수정하면 원본도 변경되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!