2017-07-27 3 views
-2

これは古い質問かもしれませんが、私はstackoverflowで何も見つかりませんでした。移動しても、マップ上の反復順序は再現性があるとは限りません。したがって、スライスにキーを保持し、そのスライスをソートすることをお勧めします。次に、そのスライスを繰り返してマップから値を取得します(キーで構成されるスライスはソートされているため、再現可能な順序になります)。したがって、これは、スライスをソートする必要があることを意味し、スライス上の反復は再現可能な順序を与えません。しかし、私は遊び場で以下のコードを試してみましたが、私はいつも繰り返しが維持されていることを知っていました。そして地図の反復の場合、なぜスライスをソートする必要がありますか?スライス反復順序が入っています

func main() { 
    var mySlice = make([]string, 0) 
    mySlice = append(mySlice, "abcd") 
    mySlice = append(mySlice, "efgh") 
    mySlice = append(mySlice, "ijkl") 
    mySlice = append(mySlice, "mnop") 
    mySlice = append(mySlice, "qrst") 
    mySlice = append(mySlice, "uvwxyz") 
    for _, val := range mySlice { 
     fmt.Println(val) 
    } 
    fmt.Println(strings.Join(mySlice, "|")) 

} 

出力:

abcd 
efgh 
ijkl 
mnop 
qrst 
uvwxyz 
abcd|efgh|ijkl|mnop|qrst|uvwxyz 
+0

スライスとマップを混在させています。 – Volker

答えて

0

あなたのスライスがある唯一の理由既にソートされた順序で項目を追加しているためです。あなたはこの

var mySlice = make([]string, 0) 
mySlice = append(mySlice, "mnop") 
mySlice = append(mySlice, "efgh") 
mySlice = append(mySlice, "uvwxyz") 
mySlice = append(mySlice, "ijkl") 
mySlice = append(mySlice, "abcd") 
mySlice = append(mySlice, "qrst") 

(またはソートされていないだろうマップからキーを引っ張ってスライスを埋め)のようにソートされていないために、項目を追加した場合、その後の反復での順序は、はい、一貫性のある(ソートされていないことが、一貫しますソートされていない)。そのため、スライスを使用してソートされた順序でマップからアイテムを取得する場合は、スライスアイテムがすでにソートされた順序で挿入されていることを保証できない限り、まずスライスをソートする必要があります。

1

スライスまたはアレイは、常に、それがメモリに配置され、すなわち、どのように一定の順序を有することになります。

あなたが読んでいたドキュメントは、マップの出力がソートされた順序になるようにスライスを並べ替えるように指示していたことでしょう。

マップの反復順序が定義されておらず、実行されるたびに異なる可能性があります。スライスを使用してマップを反復する場合、常に信頼できる順序、つまりスライス内のキーの順番に戻ってくるでしょう。

slicesについての情報をお読みになることをお勧めします。

EDIT

それが助け場合は、スライスのソートがその順序が固定されているとは何の関係もないことを示すために、次のコードを考えてみます。

words := map[int]string{ 
    0: "hello", 
    1: "there", 
    2: "goodbye", 
} 
keys:=[]int{2,0,1} 
for _, k := range keys { 
    // Will output in order: Goodbye, hello, there 
    fmt.Println("Key:", k, "Value:", words[k]) 
} 
+0

ここに私が共有したいリンクがあります:https://nathanleclaire.com/blog/2014/04/27/a-surprising-feature-of-golang-that-c​​olored-me-impressed/それは、スライスを並べ替えることを言及していますキーを反復する前にスライスオーダが固定されている場合、なぜそれをすべてソートする必要がありますか? –

+0

この記事では、スライスはマップを反復して作成されるため、スライスはランダムな順序で配置されます。スライスをソートして、キーが常に同じ昇順で並べ替えられるようにしました。 スライス内のエントリの順序は固定されています。ソートコマンドを削除してループのコピーをたくさん追加すると、マップからの要素の同じ順序が返されることがわかります。キーがスライスに追加される順序がランダムになるため、この順序がどうなるか分かりません。 –

関連する問題