Go マップの順序立てた反復: 包括的なガイド
言語の仕様により、Go マップを順番に反復するのは難しい場合があります。これは、順序の維持ではなく同時実行性を重視します。この記事では、マップを使用する利点を維持しながら、順序付けされた反復を実現するための 2 つの確実な方法について説明します。
1.キー スライスによる順序の維持
この方法では、反復の順序を確保するために別のスライスでマップ キーを追跡します。このアプローチでは、オーバーヘッドが発生しますが、シンプルさと明確な実装が実現します。
実装例:
type Key int // Key type type Value int // Value type type Map struct { m map[Key]Value keys []Key } func New() *Map { return &Map{m: make(map[Key]Value)} } 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]) } }
2. LinkedList での値のリンク
このアプローチには、実際の値と次のキーへの参照を含む構造体で値をラップすることが含まれます。これにより、要素の効率的な挿入と削除が可能になります。
例実装:
type Key int // Key type type Value int // Value type type valueWrapper struct { value Value next *Key // Next key } type Map struct { m map[Key]valueWrapper first, last *Key } func New() *Map { return &Map{m: make(map[Key]valueWrapper)} } 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.value, &k} } w := valueWrapper{value: 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.value) k = w.next } }
ボーナス:
考慮すべき追加のヒントをいくつか示します:
以上がGo マップを特定の順序で反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。