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