ホームページ >バックエンド開発 >Golang >Go マップを反復するときに順序付けられた出力を保証する方法は?

Go マップを反復するときに順序付けられた出力を保証する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-28 01:16:15620ブラウズ

How to Guarantee Ordered Output When Iterating Over Go Maps?

Go のマップ: 順序の維持と要素へのアクセス

Go では、マップはキーと値のペアを動的かつ効率的に保存する方法を提供します。ただし、配列やスライスとは異なり、マップは本質的にソートされません。これにより、反復処理時に出力が順序どおりに表示されない可能性があります。

次のコード スニペットは、この動作を示しています。

package main

import (
    "fmt"
)

type monthsType struct {
    no   int
    text string
}

var months = map[int]string{
    1:"January", 2:"Fabruary", 3:"March", 4:"April", 5:"May", 6:"June",
    7:"July", 8:"August", 9:"September", 10:"October", 11:"Novenber", 12:"December",
}

func main(){
    for no, month := range months {
        fmt.Print(no)
        fmt.Println("-" + month)
    }
}

このコードを実行すると、マップがキー(数字 1 ~ 12)の順序で印刷されません。代わりに、明らかにランダムな順序で印刷されます。

解決策: マップ内の順序の制御

マップを特定の順序で印刷するには、いくつかのオプションがあります。次のことが考えられます:

1.配列を使用します:
順序が重要な場合は、配列を使用して要素を順番に保存できます。配列は、インデックスを使用して要素に直接アクセスできる順序付けされたデータ構造を提供します。

2.ソートキー:
マップをデータ構造として保持する必要がある場合は、sort.Ints 関数を使用してソートされたキーのリストを取得し、ソートされたキーを反復処理して、マップから対応する値を取得できます。 .

コード例:

package main

import (
    "fmt"
    "sort"
)

type monthsType struct {
    no   int
    text string
}

var months = map[int]string{
    1:"January", 2:"Fabruary", 3:"March", 4:"April", 5:"May", 6:"June",
    7:"July", 8:"August", 9:"September", 10:"October", 11:"Novenber", 12:"December",
}

func main(){
    var sortedKeys []int
    for key := range months {
        sortedKeys = append(sortedKeys, key)
    }
    sort.Ints(sortedKeys)

    fmt.Println("Printing in order:")
    for _, key := range sortedKeys {
        fmt.Printf("%d-%s", key, months[key])
    }
}

このコードでは、sortedKeys 配列は次のとおりです。マップのキーを昇順で格納するために作成されます。次に、ソートされたキーを反復処理し、マップから対応する値にアクセスします。これにより、次の出力が生成されます:

Printing in order:
1-January2-Fabruary3-March4-April5-May6-June7-July8-August9-September10-October11-Novenber12-December

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。