パブリックアカウントから:New World Grocery Store
記事ディレクトリ
サイクリックパーペチュアルモーションマシン
Q1:アレイのトラバース中にアレイ要素を変更すると、停止しないループが発生する可能性がありますか?
func main() {
arr := []int{
1, 2, 3}
for _, v := range arr {
arr = append(arr, v)
}
fmt.Println(arr)
}
// 输出: 1 2 3 1 2 3
上記のコードの出力は、ループが元のスライスの3つの要素のみをトラバースすることを意味します。スライスをトラバースするときに追加の要素がループの実行回数を増やすことはないため、ループは最終的に停止します。
回答:すべての範囲ループで、Go言語はコンパイル中に新しい変数を割り当てる原切片
か数组
割り当てha
ます。コピーは割り当てプロセス中に行われるため、トラバースするスライスは元のスライス変数ではなくなります。
マジックポインター
Q2:配列をトラバースするときrange
に、戻り変数のアドレスを取得して別の配列またはハッシュに保存すると、混乱する現象が発生します
func main() {
arr := []int{
1, 2, 3}
newArr := []*int{
}
for _, v := range arr {
newArr = append(newArr, &v)
}
for _, v := range newArr {
fmt.Println(*v)
}
}
// 输出: 3 3 3
回答:インデックスと要素を同時にトラバースするこの種の範囲ループに遭遇すると、Go言語はv2
、要素をスライスに格納するための新しい変数を追加で作成します循环中使用的这个变量v2会在每一次迭代被重新赋值而覆盖, 在赋值时也发生了拷贝
。ループで返される変数のアドレスはまったく同じであるため、魔法が現れます。ポインターの現象
マップのランダムなトラバース
Q3:範囲を使用してgo言語でハッシュテーブルをトラバースすると、異なる結果が得られることがよくありますか?
回答:しかし、これはハッシュテーブルが不安定であることを意味するものではありません。これはgo言語によって意図的に設計されています。実行時のハッシュテーブルトラバーサルに不確実性が生じ、プログラムが依存してはならないことをgo言語のすべてのユーザーに通知します。ハッシュテーブルの安定したトラバース。
参照
https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-for-range/