>  기사  >  백엔드 개발  >  Go에서 지도 값의 주소를 가져올 수 없는 이유는 무엇인가요?

Go에서 지도 값의 주소를 가져올 수 없는 이유는 무엇인가요?

Linda Hamilton
Linda Hamilton원래의
2024-11-16 07:24:02435검색

Why can't I take the address of a map value in Go?

Go에서 맵 값의 주소 가져오기

질문: 왜 맵 값의 주소를 가져올 수 없나요? 지도 value?

배경:

Go 프로그래밍 언어는 맵 값의 주소를 얻기 위해 "&" 연산자의 사용을 제한합니다. 이 동작은 "&"를 사용하여 처리할 수 있는 슬라이스 값과 다릅니다.

오해 설명:

맵이 메모리 구조에 의해 뒷받침된다는 믿음과 반대 배열과 마찬가지로 실제로는 동적 재구성 버킷 구조에 저장됩니다. 이는 지도 값에 고정된 메모리 위치가 없음을 의미합니다.

기본 이유:

Go가 지도 값의 주소 가져오기를 금지하는 주된 이유는 다음과 같습니다. 지도 데이터 구조의 동적 특성. 맵 항목이 생성, 업데이트 또는 삭제되면 버킷을 재구성하여 성능과 메모리 사용량을 최적화할 수 있습니다. 지도 값에 주소가 허용된 경우 재배치 중에 주소가 무효화됩니다.

지도의 숫자 수정:

" " 및 " ="와 같은 연산자는 숫자 맵 값을 내부에서 수정하는 데 사용되는 이 단축 형식은 실제로 기본 맵 값에 직접 액세스하지 않는 일련의 작업을 수행합니다. value.

예:

func icandothis() {
    cmap := make(map[int]complex64)
    cmap[1] += complex(1, 0)
    fmt.Println(cmap[1])
}

약식 형식을 확장하면 작업이 실제로 추가를 수행하기 위한 새로운 임시 값을 생성하고 이를 맵에 다시 저장한다는 것을 알 수 있습니다. :

func icandothis() {
    cmap := make(map[int]complex64)
    v := cmap[1]
    v += complex(1, 0)
    cmap[1] = v
    fmt.Println(cmap[1])
}

에서 구조체 값 수정 지도:

숫자 값과 달리 지도에서 구조체 값을 수정하려면 다음 단계가 필요합니다.

  1. 지도에서 구조체 값을 검색합니다.
  2. 구조체 값.
  3. 수정된 구조체 값을 다시 map.

예:

type Complex struct {
    R float32
    I float32
}

func (x *Complex) Add(c Complex) {
    x.R += c.R
    x.I += c.I
}

func main() {
    cmap := make(map[int]Complex)
    c := cmap[1]
    c.Add(Complex{1, 0})
    cmap[1] = c
    fmt.Println(cmap[1])
}

이 단계를 따르면 주소가 필요 없이 구조체 값을 내부에서 수정할 수 있습니다.

위 내용은 Go에서 지도 값의 주소를 가져올 수 없는 이유는 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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