ホームページ  >  記事  >  バックエンド開発  >  Go で「無効な操作: Type *map[key]value はインデックス作成をサポートしていません」がスローされるのはなぜですか?

Go で「無効な操作: Type *map[key]value はインデックス作成をサポートしていません」がスローされるのはなぜですか?

DDD
DDDオリジナル
2024-11-25 08:07:40865ブラウズ

Why Does Go Throw

Go: 無効な操作 - タイプ *map[key]value はインデックス作成をサポートしていません

背景:

Go のポインター メカニズムは、特にマップを操作する場合に混乱を招く可能性があります。 Go では、マップは参照型です。つまり、マップを値で渡すときは、実際のマップ自体ではなく、参照のコピーを渡すことになります。ただし、引数として関数に渡される元のマップを変更する必要がある場合があります。

問題:

へのポインタによってマップを渡そうとしたときその内容を変更すると、次のエラーが発生する可能性があります:

prog.go:15: invalid operation: b[amount.Currency] (type *Balance does not support indexing)

このエラーは、ポインターにインデックスを付けようとしていることを示します。

解決策:

この問題を解決するには、マップの値へのアクセスとその値へのポインターへのアクセスを区別する必要があります。正しい方法は次のとおりです。

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 で「無効な操作: Type *map[key]value はインデックス作成をサポートしていません」がスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。