挿入順に Go マップを反復する
従来の通念では、Go マップの反復順序は予測不可能で不安定であることが示唆されています。ただし、順序の保存を実現するには、挿入シーケンスを独立して維持する代替データ構造を利用する必要があります:
1。別のスライスでキーを追跡する:
キーのスライスを挿入された順序で維持することで、キーを反復処理し、対応する値をマップから取得できます。これにより、データを重複させる必要がなくなり、信頼性の高い反復シーケンスが提供されます。
2.リンク リストでの値ラッパーの使用:
もう 1 つのアプローチでは、マップ内の各値を、挿入順序の次のキーへの参照を含む構造体でラップします。これにより、削除や挿入の後でも、意図したシーケンス内の要素を横断することができます。
比較:
どちらのメソッドも、順序付けられた反復を提供しながら、マップを使用する利点を維持します。 。ただし、キーに別のスライスを使用するアプローチは実装が単純ですが、要素を削除するときにオーバーヘッドが発生する可能性があります。リンク リストのアプローチでは削除が高速になりますが、より複雑になります。
コード スニペット:
スライス内のキー:
type Map struct { m map[Key]Value keys []Key } func (m *Map) Set(k Key, v Value) { // ... m.keys = append(m.keys, 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 m.last != nil { w := m.m[*m.last] m.m[*m.last] = valueWrapper{w.v, &k} } // ... }
これらの手法を採用すると、Go マップを効率的に繰り返し、最初に挿入された順序で項目を取得できます。
以上がGo マップを挿入順に繰り返すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。