>  기사  >  백엔드 개발  >  동일한 배열의 슬라이스에 추가할 때 Go에서 변수 덮어쓰기가 발생하는 이유는 무엇입니까?

동일한 배열의 슬라이스에 추가할 때 Go에서 변수 덮어쓰기가 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-24 08:11:01385검색

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Go에서 변수 덮어쓰기의 원인

동일한 백업 배열에 요소를 추가하여 새 슬라이스(pathA 및 pathB)를 생성하기 때문에 코드에서 변수 덮어쓰기 문제가 발생합니다. (경로)가 루프 내에 있습니다.

Go의 슬라이스 배경:

  • Go 슬라이스는 연속된 요소 블록을 나타내는 데이터 구조입니다. 동일한 유형입니다.
  • 슬라이스에는 길이(현재 저장된 요소 수)와 용량(보유할 수 있는 최대 요소 수)이 있습니다.
  • 슬라이스를 수정하면 용량이 초과된 경우 새 백업 어레이 할당.

코드 문제:

코드에서 두 개의 새 슬라이스를 생성합니다. pathA 및 pathB, 추가 기능 사용:

pathA := append(route, nextA)
pathB := append(route, nextB)

상황은 다음과 같습니다.

  1. 처음에 경로에는 nextA와 nextB 모두에 적합한 용량이 있습니다. 따라서 두 개의 새로운 슬라이스(pathA 및 pathB)가 Route와 동일한 백업 배열로 생성됩니다.
  2. 루프가 진행되고 계속해서 Route에 추가되면 용량이 결국 길이를 초과합니다.
  3. 루프의 후속 반복에서는 경로에 대한 새로운 지원 어레이가 할당됩니다. 그러나 pathA와 pathB는 여전히 이전 백업 배열을 참조합니다.
  4. nextB를 경로에 추가하면 pathA와 pathB가 공유하는 이전 백업 배열의 마지막 요소에 씁니다.
  5. 결과적으로 pathA와 pathB는 모두 동일한 최종 값이 됩니다.

해결책:

이 덮어쓰기를 방지하려면 다음을 수행해야 합니다. pathA와 pathB에 고유한 백업 어레이가 있는지 확인하십시오. make 및 copy를 사용하여 그 중 하나에 대한 새 슬라이스를 수동으로 생성하면 이를 달성할 수 있습니다.

newRoute := make([]int, len(route), (cap(route)+1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}

위 내용은 동일한 배열의 슬라이스에 추가할 때 Go에서 변수 덮어쓰기가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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