>백엔드 개발 >Golang >루프에서 새 슬라이스를 생성할 때 슬라이스 추가 동작이 변경되는 이유는 무엇입니까?

루프에서 새 슬라이스를 생성할 때 슬라이스 추가 동작이 변경되는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-03 12:46:31563검색

Why Does Slice Append Behavior Change When Creating New Slices from a Loop?

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

문제 소개

루프가 발생하면 루프 결과에서 새 조각을 만들려는 후속 시도가 예기치 않은 동작을 나타냅니다. 특히 마지막 추가 요소는 이전 추가 결과를 덮어씁니다. 이 문제는 루프 반복에서 얻은 슬라이스를 기반으로 새 슬라이스를 생성할 때 발생합니다.

분석

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

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