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

Go マップの反復に順序がないのはなぜですか? 順序を保証するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-29 05:20:13
オリジナル
273 人が閲覧しました

Why is Go Map Iteration Unordered, and How Can I Guarantee Order?

Go マップの順序が狂って印刷される

Go では、キーと値のペアを非形式で維持するハッシュ テーブルを使用してマップが実装されます。 -オーダーファッション。その結果、マップを反復処理しても、キーまたは値が返される順序は保証されません。

マップの印刷順序が狂っているのはなぜですか?

提供されたコードでは、マップの月は、月番号と対応する名前を表すキーと値のペアで定義されます。範囲を使用してマップを反復処理する場合、印刷出力の順序はハッシュ テーブルの内部実装に基づきます。これは通常、順序ではなくパフォーマンスのために最適化されます。

順序を修正する方法

マップの反復順序を保証するには、いくつかの方法があります。

1.順序付きマップを使用する:

Go には組み込みの順序付きマップ タイプがありませんが、この機能を提供するサードパーティ ライブラリがあります。そのようなライブラリの 1 つは、「github.com/golang/collections#OrderedMap」です。

import "github.com/golang/collections#OrderedMap"

func main() {
    m := collections.NewOrderedMap()
    m.Set(1, "January") // ...

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

2.マップ キーを並べ替えます:

別のオプションは、マップからキーを取得して並べ替え、並べ替えたキーを反復処理して値に順番にアクセスすることです。

func main() {
    keys := make([]int, 0, len(months))
    for k := range months {
        keys = append(keys, k)
    }

    sort.Ints(keys)

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

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

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