> 백엔드 개발 > Golang > Go Map 인덱스에서 포인터 수신기 메서드를 호출할 수 없는 이유는 무엇입니까?

Go Map 인덱스에서 포인터 수신기 메서드를 호출할 수 없는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-29 13:01:11
원래의
594명이 탐색했습니다.

Why Can't I Call a Pointer Receiver Method on a Go Map Index?

Go에서 지도 색인 역참조

지도에서 값을 조작할 때 지도에 대한 포인터 수신기의 동작을 인식하는 것이 중요합니다. 항목. 아래 코드의 예시와 같이 지도 인덱스에서 포인터 수신기 메서드를 호출하려고 할 때 일반적인 함정이 발생합니다.

package main

import "fmt"

type item struct {
    itemName string
    amount   int
}

type Cashier struct {
    items map[int]item
    cash  int
}

func (i *item) GetAmount() int {
    return i.amount
}

func main() {
    x := Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()

    fmt.Println(f[0].GetAmount()) // Error: cannot call pointer method on f[0]
}
로그인 후 복사

이 코드에서 GetAmount 메서드는 항목을 직접 조작하기 위한 포인터 수신기로 정의됩니다. 구조체. 그러나 f[0].GetAmount()를 호출하면 "f[0]에서 포인터 메서드를 호출할 수 없습니다."라는 오류가 표시됩니다. 이는 지도가 커지거나 줄어들 때 주소가 변경될 수 있어 지도 항목을 직접 처리할 수 없기 때문입니다.

이러한 동작의 이유는 Go에서 지도를 구현하는 방식에 있습니다. 맵은 성능을 최적화하기 위해 런타임 중에 크기가 조정될 수 있는 해시 테이블로 내부적으로 표시됩니다. 결과적으로 지도 항목의 주소는 시간이 지남에 따라 변경될 수 있으므로 포인터 수신자 메서드에 인수로 전달하는 것이 유효하지 않게 됩니다.

이 문제를 해결하기 위한 한 가지 접근 방식은 지도의 복사본을 만드는 것입니다. 포인터 수신기를 사용하는 대신 항목을 입력합니다. 먼저 인덱스를 사용하여 맵에서 값을 검색한 다음 해당 값의 복사본을 생성하면 됩니다.

func main() {
    x := Cashier{}
    x.AddItem("item1", 13)
    f := x.GetItems()

    itemCopy := f[0]
    fmt.Println(itemCopy.GetAmount()) // No error
}
로그인 후 복사

이 경우 itemCopy는 f[0]에 저장된 값의 복사본입니다. , 오류 발생 없이 포인터 수신기 메서드를 호출하는 데 사용할 수 있습니다.

맵 항목이 있는 포인터 수신기의 동작을 이해함으로써 개발자는 이러한 함정을 피하고 작동하는 코드를 작성할 수 있습니다. 지도 값이 올바르게 표시됩니다.

위 내용은 Go Map 인덱스에서 포인터 수신기 메서드를 호출할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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