Go에서 슬라이스는 반복할 수 있는 강력한 데이터 구조입니다. range 키워드를 사용하는 것보다. 그러나 특이한 현상으로 for-range를 사용하여 구조체 조각을 반복할 때 결과 맵의 요소는 동일한 주소를 공유합니다. 특히 원본 슬라이스의 요소에는 고유한 주소가 있어야 하기 때문에 이 동작은 혼란스러울 수 있습니다.
이 현상을 이해하는 열쇠는 변수가 지정되는 방식에 있습니다. 메모리에 저장됩니다. for-range 루프(이 경우 stu) 내에서 슬라이스 요소에 액세스할 때 지역 변수 stu는 구조체의 복사본을 보유하고 있습니다. 지역 변수에 포인터를 할당하면 맵의 모든 요소가 메모리에 있는 구조체의 동일한 복사본을 가리키게 됩니다.
이 문제를 해결하려면 슬라이스 요소의 주소를 할당하려면 슬라이스 요소 자체의 주소를 가져오도록 코드를 수정해야 합니다. stu 대신 s[i]를 사용하면 슬라이스의 실제 요소에 대한 포인터가 맵에 할당됩니다.
package main import "fmt" 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 i := range s { m[s[i].Name] = &s[i] // Change here } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } }
출력:
map[Allen:0xc0000a6058 Tom:0xc0000a6060] Allen &{Allen 24} Tom &{Tom 23}
기본적인 메모리 관리 동작을 이해함으로써 우리는 이 슬라이스 범위 현상을 다음과 같이 해결할 수 있습니다. 가다. 슬라이스 요소 자체의 주소를 취함으로써 맵의 각 요소가 메모리의 고유한 구조체를 가리키도록 하고 데이터 무결성을 유지합니다.
위 내용은 구조체를 매핑할 때 Go Slice 범위 루프가 공유 주소를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!