>백엔드 개발 >Golang >Go의 슬라이스 범위 루프가 지도의 주소 할당에 어떤 영향을 미치나요?

Go의 슬라이스 범위 루프가 지도의 주소 할당에 어떤 영향을 미치나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-03 07:06:09368검색

How Does Go's Slice Range Loop Affect Address Assignment in Maps?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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