Go 슬라이스에 추가하면 원본 슬라이스가 수정되는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-31 17:00:30
원래의
721명이 탐색했습니다.

Why does appending to a Go slice sometimes modify the original slice?

Golang Append의 슬라이스 할당 동작

Go에서는 슬라이스에 추가할 때 효율적인 처리를 위해 할당 동작을 이해하는 것이 필요합니다.

내장된 API 문서에 따르면, 기존 슬라이스의 용량이 부족할 때 Append() 함수는 데이터를 새 배열 블록에 재할당하고 복사합니다. 이는 슬라이스 설명자의 특성과 append()에서 반환된 슬라이스에 대한 의문을 제기합니다.

조합 생성을 위해 제공된 재귀 알고리즘에서 add() 함수는 슬라이스를 증분적으로 구성하는 데 사용됩니다. 그러나 AddOption 함수에서 채널을 통해 전송된 조각은 전송된 후 수정되는 것으로 관찰되었습니다. 이는 add()가 새 슬라이스를 반환해야 한다는 기대와 모순됩니다.

이 명백한 불일치를 해결하려면 슬라이스 데이터 유형과 기본 표현 간의 차이점을 명확히 하는 것이 중요합니다. 슬라이스 설명자는 두 개의 정수(길이와 용량)와 실제 데이터에 대한 포인터로 구성됩니다. Append()가 새 슬라이스를 생성할 때 새 슬라이스 설명자를 생성하지만 원본 슬라이스와 동일한 데이터 포인터를 유지합니다. 따라서 두 슬라이스 설명자 중 하나를 변경하면 두 슬라이스 모두에 영향을 미칩니다.

이를 설명하려면 다음 코드 조각을 고려하세요.

<code class="go">s := make([]int, 0, 5)
s = append(s, []int{1, 2, 3, 4}...)

a := append(s, 5)
fmt.Println(a)  // [1 2 3 4 5]

b := append(s, 6)
fmt.Println(b)  // [1 2 3 4 6]
fmt.Println(a)  // [1 2 3 4 6]</code>
로그인 후 복사

처음에 s의 용량은 5이고 make를 사용하여 구성됩니다. (). Append()는 다른 슬라이스의 요소를 s에 추가하는 데 사용됩니다. 그런 다음 두 개의 새로운 슬라이스 a와 b가 서로 다른 요소가 있는 s에 대한 추가()를 사용하여 생성됩니다. 출력을 관찰하면 a와 b 모두 동일한 데이터를 포함하며 이는 동일한 데이터 포인터를 공유한다는 것을 나타냅니다. 이는 위에 설명된 동작을 보여줍니다.

효율적인 슬라이스 조작을 보장하려면 이러한 add() 할당 동작을 이해하는 것이 중요합니다. 기존 슬라이스의 용량이 충분하면 추가()가 기존 데이터 포인터를 직접 조작하여 더욱 효율적으로 만듭니다.

위 내용은 Go 슬라이스에 추가하면 원본 슬라이스가 수정되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!