Go에서 슬라이스 범위 현상 이해
Go에서 슬라이스 범위의 동작은 혼란스러울 수 있습니다. range 절을 사용하여 슬라이스를 반복할 때 반복 변수가 각 요소의 주소를 보유하고 있다고 믿고 싶은 유혹이 있습니다. 그러나 항상 그런 것은 아닙니다. 그러한 시나리오 중 하나는 구조체와 맵으로 작업할 때입니다.
다음 코드를 고려하세요.
type student struct { Name string Age int } func main() { m := make(map[string]*student) s := []student{ {Name: "Allen", Age: 24}, {Name: "Tom", Age: 23}, } for _, stu := range s { m[stu.Name] = &stu } }
이 코드는 구조체 조각을 반복하고 키-값 쌍을 맵에 추가합니다. 각 구조체를 생성하고 구조체의 주소를 값으로 저장합니다. 그러나 결과 맵은 모든 값이 동일한 주소를 가리킨다는 것을 보여줍니다.
이 현상을 설명하려면 슬라이스 범위의 기본 구현을 살펴봐야 합니다. range 절을 사용하여 슬라이스를 반복하면 반복 변수는 슬라이스에서 요소의 복사본을 받습니다. 따라서 반복 변수는 주소가 아닌 구조체의 복사본을 보유합니다.
이 문제를 해결하고 구조체의 주소를 맵에 저장하려면 슬라이스 요소의 주소를 가져오도록 코드를 수정해야 합니다. :
for i := range s { m[s[i].Name] = &s[i] }
이러한 변경을 통해 반복 변수가 구조체의 주소를 보유하고 맵이 슬라이스에 있는 각 구조체의 주소를 올바르게 저장하게 됩니다.
위 내용은 Go에서 슬라이스 범위 반복이 때때로 주소 대신 복사본을 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!