슬라이스에 추가 작업 시 예기치 않은 동작
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!