「マップ要素のアドレスを取得できない」のはなぜですか?
次のコード スニペットを考えてみましょう:
odsMap := map[string]XMLElement{ "key": {Value: "value"}, } segRef := "key"
次のステートメントは機能します:
x := odsMap[segRef] x.GetValue("@OriginDestinationKey")
ただし、このステートメントは次のエラーで失敗します。次のエラー:
cannot call pointer method on odsMap[segRef] cannot take the address of odsMap[segRef]
これらのエラーは、マップ インデックス式がアドレス指定できないために発生します。新しいエントリが追加されるとマップの内部構造が変更され、そのアドレスが取得できなくなる可能性があります。
したがって、マップに格納されている非ポインタ値に対するポインタ レシーバを使用してメソッドにアクセスする場合、動作例で見られるように、その値のアドレスを取得するには中間変数が必要です。
この問題を回避するには、代わりにマップにポインター値を格納することを検討してください。例:
type My int func (m *My) Str() string { return strconv.Itoa(int(*m)) } odsMap := map[string]*My{} my := My(12) odsMap[segRef] = &my
または、非ポインタ値をローカル変数に割り当て、そのアドレスを取得することもできます:
x := odsMap[segRef] x.GetValue("@OriginDestinationKey") // Method call on *XMLElement
結論として、マップ インデックス式はアドレス指定可能ではありません。マップ内の非ポインター値のポインター メソッドにアクセスする場合は、中間変数または代替ストレージ戦略の使用が必要になります。
以上がGo でマップ要素のアドレスを取得できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。