ホームページ > バックエンド開発 > Golang > Go マップを挿入順に繰り返すにはどうすればよいですか?

Go マップを挿入順に繰り返すにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-19 20:52:16
オリジナル
280 人が閲覧しました

How Can I Iterate Through a Go Map in the Order of Insertion?

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

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