>백엔드 개발 >Golang >하나의 Go 변수를 설정하면 다른 변수를 덮어쓰는 이유는 무엇입니까?

하나의 Go 변수를 설정하면 다른 변수를 덮어쓰는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-24 08:09:30955검색

Why Does Setting One Go Variable Overwrite the Other?

Go 변수를 덮어쓰는 중

이 코드에서 작성자는 pathB를 설정할 때 pathA 변수를 덮어쓰는 문제에 직면합니다. 이는 두 변수가 모두 동일한 기본 배열을 참조하여 하나의 수정이 다른 하나에 영향을 미친다는 것을 의미합니다.

이 문제는 Go에서 슬라이스와 함께 추가() 함수를 사용하는 데서 발생합니다. 요소를 슬라이스에 추가할 때 Go는 기본 배열에 새 요소를 수용할 만큼 충분한 용량이 있는지 확인합니다. 그렇지 않은 경우 더 큰 배열을 할당하고 기존 요소를 복사합니다.

제공된 코드에서 슬라이스 경로는 pathA와 pathB를 모두 생성하는 데 사용됩니다. pathA 또는 pathB에 추가할 때 기본 경로 배열의 용량이 초과되면 새 배열이 할당됩니다. 그러나 pathA와 pathB는 모두 동일한 슬라이스에서 파생되므로 동일한 기본 배열을 공유합니다.

이 문제를 방지하려면 경로를 사용하여 pathA와 pathB를 초기화하기 전에 경로의 독립적인 복사본을 생성해야 합니다. 이는 작성자의 두 번째 편집에서 볼 수 있듯이 make() 및 copy() 함수를 사용하여 수행할 수 있습니다.

<code class="go">newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i])+1)*2)
copy(newRoute, prePaths[i])

pathA := append(newRoute, nextA)
pathB := append(prePaths[i], nextB)</code>

이 수정된 코드에서 newRoute는 자체 기본 배열이 있는 별도의 슬라이스입니다. 이렇게 하면 pathA와 pathB가 독립적인 데이터 복사본을 가지게 되어 하나의 수정이 다른 하나에 영향을 미치는 것을 방지할 수 있습니다.

위 내용은 하나의 Go 변수를 설정하면 다른 변수를 덮어쓰는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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