マップ内の構造体フィールドへの代入
Go でマップを操作する場合、マップ内の構造体フィールドへの代入の影響を理解することが重要です。地図。 「マップ内の構造体フィールドに代入できません」というエラーは、マップに格納されている値の構造体フィールドを直接変更しようとすると発生します。このエラーは、Go でのマップの実装方法が原因で発生します。
Go では、マップはキーの型が同等であり、要素の型は構造体を含む任意の型であるペアのコレクションです。ただし、構造体の値が要素としてマップに配置される場合、そのアドレス指定可能性は保持されません。これは、フィールドをポインタであるかのように変更しようとすると、前述のエラーが発生することを意味します。
次のコードを考えてみましょう。
type Snapshot struct { Key string Users []Users } snapshots := make(map[string] Snapshot, 1) // Initialization snapshots["test"] = Snapshot { Key: "testVal", Users: make([]Users, 0), }
次に、新しいユーザーをマップに保存されているスナップショット値内でユーザーがスライスを実行すると、恐ろしいエラーが発生します:
snapshots["test"].Users = append(snapshots["test"].Users, user)
この課題を克服するには、2 つの実行可能な方法があります。解決策:
方法 1:
変更する前に、マップに格納されている構造体の値のローカル コピーを作成し、変更したコピーでマップ エントリを再割り当てします。
tmp := snapshots["test"] tmp.Users = append(tmp.Users, user) snapshots["test"] = tmp
メソッド2:
または、ポインター型を使用してマップを定義します。これにより、構造体フィールドの変更が可能になります:
snapshots := make(map[string] *Snapshot, 1) // Initialization snapshots["test"] = &Snapshot { Key: "testVal", Users: make([]Users, 0), }
snapshots["test"].Users = append( snapshots["test"].Users, user) が有効になり、エラーは発生しません。ただし、2 番目の解決策はメモリ管理に影響を与える可能性があるため、注意して使用する必要があることに注意することが重要です。
以上がGo でマップの構造体フィールドを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。