Go 포인터와 관련된 프로젝트에서 흥미로운 문제가 발생했습니다. 문제는 구조체 객체 조각을 인터페이스 조각으로 변환할 때 첫 번째 포인터의 메모리 주소가 출력에 반복적으로 사용된다는 점이었습니다.
이 문제를 해결하기 위해 개발자는 추가 포인터를 사용하도록 변환 함수를 수정했습니다. 변수를 사용하여 예상한 결과를 얻었습니다.
이로 인해 질문이 제기됩니다. 원래 솔루션이 실패한 이유는 무엇입니까? 이를 이해하려면 Go가 포인터와 슬라이스를 처리하는 방법을 자세히 알아볼 필요가 있습니다.
Go에서 *coll 표현식은 기본 배열, 길이 및 용량에 대한 정보가 포함된 슬라이스 헤더를 반환합니다. 슬라이스의 요소에 액세스할 때 인덱스 idx의 요소에 대한 참조를 반환하는 (*coll)[idx] 표현식이 사용됩니다.
원래 솔루션에서 item은 범위의 루프 변수였습니다. *콜 루프. 이 루프는 슬라이스 헤더를 반복하여 슬라이스의 각 요소를 루프 변수 항목에 할당합니다. 그러나 item은 루프 변수이므로 해당 메모리 주소는 루프 전체에서 동일하게 유지됩니다. 따라서 &item이 출력 슬라이스에 추가되면 동일한 메모리 주소가 여러 번 추가되어 관찰된 동작이 발생합니다.
수정된 솔루션은 i := (*coll)[idx] 표현식을 사용합니다. 인덱스 idx의 요소를 지역 변수 i에 할당하는 루프입니다. 이 변수는 루프 변수 항목과 별개의 메모리 주소를 가지므로 &i가 출력 슬라이스에 추가되면 각 요소는 서로 다른 메모리 주소를 갖습니다.
루프 변수 간의 메모리 주소 차이를 설명하려면 그리고 액세스되는 요소에 대해 다음 코드를 고려하십시오.
package main import "fmt" func main() { coll := []int{5, 10, 15} for i, v := range coll { fmt.Printf("This one is always the same; %v\n", &v) fmt.Println("This one is 4 bytes larger each iteration; %v\n", &coll[i]) } }
이 코드를 실행하면 &v가 루프의 모든 반복에 대해 동일한 메모리 주소를 갖는 반면 &coll[i]는 각 반복마다 다른 메모리 주소가 필요합니다.
위 내용은 Go에서 직접 슬라이스 변환이 포인터에 동일한 메모리 주소를 재사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!