Go では、マップに格納されている構造体のフィールドを変更しようとすると、 「割り当てられません」というエラーが発生する場合があります。この問題は、マップ内の値への直接割り当てを制限するアドレス指定可能性の概念に起因します。
ペア構造体は、dictionary["xxoo"] など、マップ内に 2 つの float64 値を保持します。マップ値がアドレス指定できないため、dictionary["xxoo"].b への新しい値の割り当ては失敗します。
Go マップは、データを効率的に保存および取得するように設計されています。この効率を維持するために、マップ値はアドレス指定できません。つまり、メモリ管理により必要に応じてマップ値を移動できます。アドレス指定可能性がないと、セレクター (.) 演算子を使用して構造体フィールドにアクセスして直接代入することはできません。
この制限を回避するには、マップ値としてポインター型を使用します。たとえば、map[string]*pair を定義すると、ポインター間接指定により構造体がアドレス指定可能になります。これにより、次のコードに示すように、直接割り当てが可能になります:
dict := make(map[string]*pair) dict["xxoo"] = &pair{5.0, 2.0} dict["xxoo"].b = 5.0
または、値の型を持つマップを使用する場合は、既存の値のコピーを割り当てるか、新しい値全体を指定します:
p := dict["xxoo"] p.b = 5.0 dict["xxoo"] = p // or dict["xxoo"] = pair{5.0, 5.0}
アドレス指定可能性を理解し、適切なソリューションを実装することで、Go マップに格納されている構造体を効果的に操作できます。
以上がGo マップの構造体フィールドに代入できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。