ホームページ > バックエンド開発 > Golang > Go マップ上で順序付けされた反復を保証するにはどうすればよいですか?

Go マップ上で順序付けされた反復を保証するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-25 20:09:13
オリジナル
949 人が閲覧しました

How Can I Guarantee Ordered Iteration Over Go Maps?

Go のマップは順序を保持します - ただし、考えられるような方法ではありません

Go では、マップはソートされていないデータ構造です。これは、マップ内のキーと値のペアの順序が一貫していることが保証されていないことを意味します。これは、マップを特定の順序で反復する必要がある場合に問題になる可能性があります。

次のコードを考えてみましょう:

package main

import (
    "fmt"
)

func main() {
    months := map[int]string{
        1:  "January",
        2:  "February",
        3:  "March",
        4:  "April",
        5:  "May",
        6:  "June",
        7:  "July",
        8:  "August",
        9:  "September",
        10: "October",
        11: "November",
        12: "December",
    }

    for index, month := range months {
        fmt.Println(index, "-", month)
    }
}
ログイン後にコピー

このコードを実行すると、次のような出力が期待されるかもしれません。 1 月から 12 月までの月を順に指定します。しかし、実際はそうではありません。代わりに、月が一見ランダムな順序で出力されていることがわかります。

なぜこれが起こるのですか?

この理由は、Go マップ内のキーがソートされていない状態で保存されているためです。配列。マップを反復処理する場合、キーは配列に格納されている順序でアクセスされます。

解決策

取得するには、いくつかの異なる方法があります。この問題について。 1 つの方法は、配列を使用してキーを順番に保存することです。その後、配列を反復処理して、目的の順序でマップの要素にアクセスできます。

この問題を回避するもう 1 つの方法は、並べ替えられたマップを使用することです。ソートされたマップは、キーがソートされた順序で格納されることを保証するマップです。これは、特定の順序でマップを反復処理する必要がある場合に便利です。

次のコードは、配列を使用してキーを格納する方法を示しています。 order:

package main

import (
    "fmt"
    "sort"
)

func main() {
    months := map[int]string{
        1:  "January",
        2:  "February",
        3:  "March",
        4:  "April",
        5:  "May",
        6:  "June",
        7:  "July",
        8:  "August",
        9:  "September",
        10: "October",
        11: "November",
        12: "December",
    }

    keys := []int{}
    for key := range months {
        keys = append(keys, key)
    }

    sort.Ints(keys)

    for _, key := range keys {
        fmt.Println(key, "-", months[key])
    }
}
ログイン後にコピー

このコードを実行すると、出力が 1 月から 12 月までの月順であることがわかります。

以上がGo マップ上で順序付けされた反復を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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