Go에서 '잘못된 작업: *map[key]값을 입력하면 인덱싱을 지원하지 않습니다'라는 오류가 발생하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-25 08:07:40
원래의
872명이 탐색했습니다.

Why Does Go Throw

이동: 잘못된 연산 - 유형 *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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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