이동: 잘못된 연산 - 유형 *map[key]값이 인덱싱을 지원하지 않음
배경:
Go의 포인터 메커니즘은 특히 지도 작업 시 혼란스러울 수 있습니다. Go에서 지도는 참조 유형입니다. 즉, 값으로 지도를 전달할 때 실제 지도 자체가 아닌 참조 사본을 전달한다는 의미입니다. 그러나 때로는 함수에 인수로 전달되는 원본 맵을 수정해야 할 수도 있습니다.
문제:
포인터로 맵을 전달하려고 할 때 내용을 수정하면 다음 오류가 발생할 수 있습니다.
prog.go:15: invalid operation: b[amount.Currency] (type *Balance does not support indexing)
이 오류는 지도에 대한 포인터를 색인화하려고 시도하고 있음을 나타냅니다. Go에서는 지원되지 않습니다.
해결책:
이 문제를 해결하려면 지도 값에 대한 액세스와 지도 값에 대한 포인터 액세스를 구별해야 합니다. 올바른 방법은 다음과 같습니다.
func (b *Balance) Add(amount Amount) *Balance { // Index the *b (pointer to map) to get the map itself current, ok := (*b)[amount.Currency] // Continue modifying the indexed map // ... }
*b를 사용하여 포인터 b를 역참조하면 지도 자체에 액세스하고 필요한 작업을 수행할 수 있습니다.
대체 접근 방식:
이 경우처럼 맵이 구조체의 유일한 필드인 경우 예를 들어 포인터로 전달하는 것을 피할 수 있습니다. 대신 다음 코드와 같이 값으로 전달하세요.
func Add(b Balance, amount Amount) Balance { // ... do your operations on the passed map ... return b }
Go는 기본적으로 참조로 맵을 전달하므로 값으로 전달하더라도 내부적으로는 여전히 참조로 처리되며 모든 변경 사항이 발생합니다. 함수 내에서 작성된 내용은 원본 지도에 반영됩니다.
지도 작업 시 지도 자체의 색인 생성과 지도에 대한 포인터의 색인 생성을 항상 구별해야 한다는 점을 기억하세요. 이렇게 하면 이 경우에 발생하는 것과 같은 오류를 방지하는 데 도움이 됩니다.
위 내용은 Go에서 '잘못된 작업: *map[key]값을 입력하면 인덱싱을 지원하지 않습니다'라는 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!