"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 동일한 배열의 슬라이스에 추가할 때 Go에서 변수 덮어쓰기가 발생하는 이유는 무엇입니까?

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

2024년 11월 10일에 게시됨
검색:263

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)가 경로와 동일한 지원 배열을 사용하여 생성됩니다.
  2. 루프가 진행되고 경로에 계속 추가됨에 따라 해당 용량은 결국 길이를 초과합니다.
  3. 루프의 후속 반복에서는 경로에 대한 새로운 지원 어레이가 할당됩니다. 그러나 pathA 및 pathB는 여전히 이전 지원 배열을 참조합니다.
  4. nextB를 경로에 추가하면 pathA와 pathB 모두에서 공유되는 이전 지원 배열의 마지막 요소에 씁니다.
  5. 결과적으로 pathA와 pathB는 모두 동일한 최종 결과로 끝납니다. value.

해결책:

이 덮어쓰기를 방지하려면 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)
}
릴리스 선언문 이 글은 1729727920에서 재인쇄되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3