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