Go での値によるマップの受け渡しとポインターによるマップの受け渡し
Go では、特に次のものを扱う場合、値によるマップの受け渡しとポインターによるマップの受け渡しが混乱する可能性があります。マップの種類。この記事では、コンパイル エラーにつながる、ポインタで渡されたマップのインデックス付けの問題について説明します。
問題
ポインタでマップを渡し、そのマップを変更しようとしたとき値を指定すると、Go はその型がインデックス付けをサポートしていないというエラーを生成します。これは、マップではポインタのインデックス作成がサポートされていないためです。
解決策
このエラーを回避するには、マップのインデックスを作成する前にポインタを逆参照します。 b[amount.Currency] の代わりに、(*b)[amount.Currency] を使用します。
さらなる議論
デフォルトでは、整数などの単純な型は、によって渡されます。値を渡しますが、構造体とインターフェイスは参照によって渡されます。ただし、地図の場合はこの限りではありません。マップはデフォルトで参照によって渡されるため、値またはポインターによって渡すことは本質的に同じです。
上記の例では、マップはすでに参照によって渡されているため、Add メソッドにポインター レシーバーを使用する必要はありません。このメソッドは、機能を損なうことなく次のように記述できます。
func (b Balance) Add(amount Amount) Balance { current, ok := b[amount.Currency] if ok { b[amount.Currency] = current + amount.Value } else { b[amount.Currency] = amount.Value } return b }
要約すると、マップを操作する場合、コピーを避けるためにマップをポインタで渡す必要はありません。値渡しでは、逆参照をしなくても同じ結果が得られます。
以上がGo でポインターによって渡されたマップにインデックスを付けるとコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。