> 백엔드 개발 > Golang > Go에서 슬라이스 범위 반복이 때때로 주소 대신 복사본을 반환하는 이유는 무엇입니까?

Go에서 슬라이스 범위 반복이 때때로 주소 대신 복사본을 반환하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-05 15:54:14
원래의
208명이 탐색했습니다.

Why Do Slice Range Iterations in Go Sometimes Return Copies Instead of Addresses?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿