ホームページ > バックエンド開発 > Golang > 挿入オーダーで Go マップを反復処理するにはどうすればよいですか?

挿入オーダーで Go マップを反復処理するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-27 07:35:09
オリジナル
729 人が閲覧しました

How Can I Iterate Over a Go Map in Insertion Order?

挿入順序でマップを反復する

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

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