> 백엔드 개발 > Golang > 구조체를 매핑할 때 Go Slice 범위 루프가 공유 주소를 생성하는 이유는 무엇입니까?

구조체를 매핑할 때 Go Slice 범위 루프가 공유 주소를 생성하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-04 22:44:11
원래의
569명이 탐색했습니다.

Why Do Go Slice Range Loops Create Shared Addresses When Mapping Structs?

Go Slice 범위 현상 이해

문제: 신비한 슬라이스 범위 동작

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

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