挿入順序でマップを反復する
Go マップでは反復順序が保証されないため、挿入された順序でマップ項目を取得することが困難になります。これに対処するには、次のアプローチを検討してください。
キー スライスの使用
挿入順序でキーを追跡するために別のスライスを維持します。キーと値のペアをマップに追加するときは、そのキーがスライスに存在するかどうかを確認してください。そうでない場合は追加してください。マップを反復処理する場合、キー スライスを使用して項目にアクセスします。
type Map struct { m map[Key]Value keys []Key } func (m *Map) Set(k Key, v Value) { if _, ok := m.m[k]; !ok { m.keys = append(m.keys, k) } m.m[k] = v } func (m *Map) Range() { for _, k := range m.keys { fmt.Println(m.m[k]) } }
リンク リスト値ラッパーの使用
マップ値を次のデータ構造でラップします。値と、挿入順で次のキーへのポインタを格納します。キーと値のペアを追加するたびに、前の値ラッパーの次のポインターを更新します。挿入順序で反復するには、最初のキーから開始して次のポインターに従います。
type valueWrapper struct { value Value next *Key } type Map struct { m map[Key]valueWrapper first, last *Key } func (m *Map) Set(k Key, v Value) { if _, ok := m.m[k]; !ok && m.last != nil { w2 := m.m[*m.last] m.m[*m.last] = valueWrapper{w2.v, &k} } w := valueWrapper{v: v} m.m[k] = w if m.first == nil { m.first = &k } m.last = &k } func (m *Map) Range() { for k := m.first; k != nil; { w := m.m[*k] fmt.Println(w.v) k = w.next } }
これらのソリューションは、マップの利点を維持しながら挿入順序を維持する必要性に対処します。キー追跡をマップ操作から分離するか、値を順番にリンクすることにより、目的の順序でマップを確実に反復できます。
以上が挿入オーダーで Go マップを反復処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。