> 백엔드 개발 > Golang > 루프의 슬라이스에 추가하면 Go에서 예상치 못한 결과가 발생하는 이유는 무엇입니까?

루프의 슬라이스에 추가하면 Go에서 예상치 못한 결과가 발생하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-03 04:57:31
원래의
1162명이 탐색했습니다.

Why Does Appending to a Slice in a Loop Produce Unexpected Results in Go?

슬라이스에 추가 작업 시 예기치 않은 동작

Go에서는 루프 반복 중에 슬라이스에 요소를 추가한 다음 새 항목을 생성할 때 예기치 않은 동작이 발생할 수 있습니다. 결과에 따라 조각을 만듭니다. 이 동작은 참조를 분할하는 기본 배열에서 비롯됩니다.

다음 코드를 고려하세요.

<code class="go">func create(iterations int) []int {
    a := make([]int, 0)
    for i := 0; i < iterations; i++ {
        a = append(a, i)
    }
    return a
}</code>
로그인 후 복사

create(11)를 호출하고 결과를 i에 할당하면 이후의 각 추가가 예상됩니다. 연산(j :=append(i, 100), g :=append(i, 101), h :=append(i, 102))을 사용하여 고유한 값을 가진 새 슬라이스를 생성합니다. 그러나 관찰된 동작은 이러한 새 슬라이스의 마지막 요소가 인덱스에 관계없이 항상 102라는 것입니다.

이는 모든 추가가 동일한 기본 배열을 수정하기 때문에 발생합니다. 슬라이스에 요소를 추가하면 길이가 변경되고 배열이 재할당될 수 있습니다. 새 배열이 할당되면 이전 배열에 대한 모든 이전 참조가 무효화됩니다.

그러나 추가가 지원 배열의 용량을 초과하는 경우 새 배열이 항상 할당되므로 슬라이스 리터럴은 예상대로 작동합니다.

관용적 접근 방식

기존 슬라이스를 기반으로 여러 개의 새 슬라이스를 생성할 때 예측 가능한 동작을 보장하기 위한 관용적 접근 방식은 요소를 추가하기 전에 슬라이스를 복사하는 것입니다.

<code class="go">func makeFromSlice(sl []int) []int {
    result := make([]int, len(sl))
    copy(result, sl)
    return result
}</code>
로그인 후 복사

복사를 수행하여 새로운 백업 어레이를 생성하고 결과 슬라이스에 대한 변경 사항이 원본 슬라이스에 영향을 미치지 않도록 합니다.

위 내용은 루프의 슬라이스에 추가하면 Go에서 예상치 못한 결과가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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