ホームページ > バックエンド開発 > Golang > Go でマップの構造体フィールドを変更するにはどうすればよいですか?

Go でマップの構造体フィールドを変更するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-06 20:23:13
オリジナル
389 人が閲覧しました

How to Modify Struct Fields in Maps in Go?

マップ内の構造体フィールドへの代入

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート