Go 슬라이스 범위의 동작 이해
Go에서 슬라이스는 요소의 효율적이고 동적인 저장을 제공하는 기본적인 데이터 구조입니다. 조각으로 작업할 때 범위 루프의 동작을 이해하는 것이 중요합니다.
다음 코드 조각을 고려하세요.
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 } fmt.Println(m) for key, value := range m { fmt.Println(key, value) } }
코드는 학생 구조체 조각과 맵을 정의합니다. 각 요소가 변수 'stu'에 할당되는 범위 루프를 사용하여 슬라이스를 반복합니다. 그러나 관찰된 예상치 못한 동작은 모든 맵 항목이 슬라이스 내의 동일한 주소를 가리킨다는 것입니다.
근본 원인:
문제는 범위 루프 할당에서 발생합니다. 변수 'stu'에 루프가 반복되면 'stu'에는 해당 인덱스에 있는 슬라이스 요소의 복사본이 할당됩니다. 결과적으로 모든 맵 항목은 동일한 복사된 값을 참조합니다.
해결책:
이 동작을 해결하려면 코드가 각 슬라이스의 주소를 명시적으로 가져와야 합니다. 요소를 맵에 저장하기 전에:
for i := range s { m[s[i].Name] = &s[i] }
이렇게 변경하면 이제 각 맵 항목이 실제 슬라이스 요소의 주소를 참조하여 예상되는 동작. 이는 슬라이스 범위 루프의 미묘한 차이를 이해하는 것이 중요하며 Go에서 데이터 조작에 어떤 영향을 미칠 수 있는지를 보여줍니다.
위 내용은 Go의 슬라이스 범위 루프가 지도의 주소 할당에 어떤 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!