Go Specから:マップエントリが反復中に作成されている場合繰り返し処理中にマップに項目を追加すると、結果が一貫しないのはなぜですか?
、そのエントリは反復中に生成することができるか、スキップしてもよいです。
それでは、私はその文に期待することは、次のコードは、少なくともプリント枚数1
、そして何より番号印刷しようとしている予測不可能であり、あなたがプログラムを実行するたびに異なっているべきであるということです。
package main
import (
"fmt"
)
func main() {
test := make(map[int]int)
test[1] = 1
j := 2
for i, v := range test {
fmt.Println(i, v)
test[j] = j
j++
}
return
}
自分のラップトップ上で、それは8
まで、遊び場(まだバージョン1.8)で、それはまさにまで3
を印刷します印刷し、最大で(バージョン1.8を移動します)! 私はその移動がvanillaではないので、遊び場からの結果はあまり気にしませんが、なぜ私のローカルでは8
以上を印刷しないのでしょうか?さらに私は、各反復でより多くのアイテムを追加しようとしましたが、8
を上回る可能性を出す可能性はありますが、違いはありません。
EDITは:マップがmake
機能でのみ1バケットが割り当てられている任意のサイズのパラメータを指定しないと、各バケットに行くに作成され@Schwernの答え
に基づいて自分自身の説明は、8の大きさを持っています要素が含まれているので、範囲が開始されると、マップに1つのバケットしかなく、最大8回反復されます。 make(map[int]int, 8)
のように7より大きいサイズパラメータを使用すると、2つのバケットが作成され、追加されたアイテムに対して8回以上の反復が行われる可能性があります。
私の推測では、 'test:= make(map [int] int)'は8つのキーと値のペアのためのスペースを持つマップを構築します。その後、Goは新しいループ配列を作成して、forループに格納されたコピーが使い果たされ、コードの実行がループを終了します。 –
Go Playgroundは、そのランダム関数に固定の設定を使用することに注意してください。 – Schwern