>백엔드 개발 >Golang >Go 슬라이스를 복사해도 전체 복사가 생성되지 않는 이유는 무엇이며 의도하지 않은 변형을 방지하려면 어떻게 해야 합니까?

Go 슬라이스를 복사해도 전체 복사가 생성되지 않는 이유는 무엇이며 의도하지 않은 변형을 방지하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-27 18:38:14509검색

Why Does Copying a Go Slice Not Create a Deep Copy, and How Can I Avoid Unintended Mutations?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.