>백엔드 개발 >Golang >Go의 'append' 함수에 포인터를 추가하면 예기치 않은 덮어쓰기가 발생하는 이유는 무엇입니까?

Go의 'append' 함수에 포인터를 추가하면 예기치 않은 덮어쓰기가 발생하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-25 03:36:17742검색

Why Does Appending Pointers in Go's `append` Function Lead to Unexpected Overwriting?

Go의 "append" 기능에서 예기치 않은 덮어쓰기 문제

Go에서 추가 기능은 추가 요소로 슬라이스를 확장하는 데 자주 사용됩니다. 그러나 때때로 구조에 포인터를 추가할 때 예기치 않은 동작이 발생할 수 있습니다.

다음 코드 조각을 고려하세요.

흥미롭게도 {0} {1} {2} { 3}, 코드는 {0} {3} {3} {3}을 출력합니다. 이 예상치 못한 동작은 Go 동작의 근본적인 측면에서 비롯됩니다.

Copies in for Range Loops

Go는 for range 루프를 사용하여 슬라이스와 배열을 반복하여 복사본을 생성합니다. 반복하는 동안 각 요소의 우리 코드에서 for range 루프 변수 e는 배열 요소 b[i]의 임시 복사본을 나타냅니다. 안타깝게도 이 임시 변수의 주소를 슬라이스 a에 추가합니다.

수정

이 문제를 해결하려면 임시 변수의 주소를 추가해야 합니다. 임시 복사본 대신 원본 배열 요소입니다. 인덱스 i를 사용하도록 for 루프를 수정하여 올바른 주소가 슬라이스에 추가되도록 합니다.

이 변경으로 인해 {0} {1} {2} {3의 예상 출력이 생성됩니다. }.

행동 이유

Go의 실제 참조 부족 이 행동에 기여합니다. 참조가 사용되는 C 또는 Java에서는 루프 변수가 배열 요소를 직접 참조하여 루프 변수를 통한 변형을 허용합니다. 그러나 Go에서 루프 변수는 참조가 아닌 요소의 복사본을 보유하는 고유한 변수입니다. 결과적으로 루프 변수에 대한 변경 사항은 원래 배열 요소에 반영되지 않습니다.

위 내용은 Go의 'append' 함수에 포인터를 추가하면 예기치 않은 덮어쓰기가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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