예기치 않은 슬라이스 추가 동작
문제 소개
루프가 발생하면 루프 결과에서 새 조각을 만들려는 후속 시도가 예기치 않은 동작을 나타냅니다. 특히 마지막 추가 요소는 이전 추가 결과를 덮어씁니다. 이 문제는 루프 반복에서 얻은 슬라이스를 기반으로 새 슬라이스를 생성할 때 발생합니다.
분석
관찰된 동작은 Go 슬라이스와 배열이 모두 사용한다는 사실에서 비롯됩니다. 동일한 기본 데이터 구조. 슬라이스에 추가할 때 Go는 동일한 기본 배열을 참조하는 새로운 슬라이스 객체를 생성합니다. 이는 원본 슬라이스에 대한 변경 사항이 새 슬라이스에도 영향을 미친다는 것을 의미합니다.
해결책
이러한 동작을 방지하려면 만들기 전에 슬라이스를 복사하는 것이 중요합니다. 모든 수정. 그러면 기본 배열에 대한 자체 독립적인 참조가 있는 새 슬라이스 객체가 생성됩니다. 이를 달성하는 관용적인 방법은 복사 기능을 사용하는 것입니다.
<code class="go">func makeFromSlice(sl []int) []int { result := make([]int, len(sl)) copy(result, sl) return result }</code>
makeFromSlice(i)의 결과를 주 함수의 j에 할당하여 원본 i와 독립적인 새 슬라이스를 생성합니다. 일부분. 이 새로운 슬라이스는 원본에 영향을 주지 않고 안전하게 수정할 수 있습니다.
슬라이스 리터럴과 대조
슬라이스 리터럴(예: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 용량을 초과하여 추가되는 경우 항상 새로운 기본 배열을 할당합니다. 이는 SliceFromLiteral이 예상대로 작동하는 이유를 설명합니다.
결론
슬라이스 작업 시 슬라이스를 수정하기 전에 항상 복사본을 만드는 것을 잊지 마세요. 이렇게 하면 새 조각에 대한 변경 사항이 원본에 영향을 주지 않습니다. 복사 기능은 이를 수행하는 관용적이고 효율적인 방법을 제공합니다.
위 내용은 루프에서 새 슬라이스를 생성할 때 슬라이스 추가 동작이 변경되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!