2017-01-15 3 views
-2

サンドボックス(https://play.golang.org/p/LpOGMsl7W1)と私のPC上でコードを実行すると、別の配列キーの順序が表示されます。私のPC(ウィンドウ)は、コンパイルするたびに異なる順序を示します。注文を変更するためのGoLang

package main 

import "fmt" 

func main() { 
    currencies := map[int]int{ 
     5000: 100, 
     1000:4, 
     500:8, 
     100:3, 
    } 

    fmt.Printf("%v", currencies) 


    for key := range currencies { 
     fmt.Printf("\n%v", key) 
     } 

} 

なぜそれが起こるのか、それを避ける方法を説明できますか?

+0

ソリューション、[受注範囲のループでGolangマップ]を参照してください(http://stackoverflow.com/questions/39450120/ golang-map-in-order-range-loop/39450454#39450454)。 – icza

答えて

0

Go blog: Go maps in actionには優れた説明があります。

範囲ループを有するマップを反復する場合、反復順序が 指定されていない場合、次の1つの反復 から同じであることが保証されません。 Go 1以降、ランタイムはマップの反復順序をランダム化します。 のプログラマーは、以前の 実装の安定した反復順序に依存していました。安定した反復注文が必要な場合は、 にその注文を指定する別のデータ構造を維持する必要があります。

しかし、あなたはあなたのマップを並べ替えることができます:固定(挿入)の繰り返し順序について

package main 

import (
    "fmt" 
    "sort" 
) 

func main() { 
    currencies := map[int]int{ 
     5000: 100, 
     1000:4, 
     500:8, 
     100:3, 
    } 

    fmt.Printf("%v", currencies) 

    var keys []int 
    for k := range currencies { 
     keys = append(keys, k) 
    } 
    sort.Ints(keys) 

    for _, k := range keys { 
     fmt.Printf("\n%v", currencies[k]) 
    } 
} 
関連する問題