关于后端:forrange造就循环永动机快来看看go中forrange的那些事

37次阅读

共计 810 个字符,预计需要花费 3 分钟才能阅读完成。

来自公众号:新世界杂货铺

循环永动机

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

上述代码的输入意味着循环只遍历了原始切片中的三个元素, 咱们遍历切片时追加的元素不会减少循环的执行次数, 所以循环最终还是停了下来

答: 对于所有的 range 循环, 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

答: 遇到这种同时遍历索引和元素的 range 循环时,go 语言会额定创立一个新的 v2 变量存储切片中的元素, 循环中应用的这个变量 v2 会在每一次迭代被从新赋值而笼罩, 在赋值时也产生了拷贝. 因为在循环中返回的变量的地址都完全相同, 所以才会呈现神奇的指针的景象

map 的随机遍历

Q3: go 语言中应用 range 遍历哈希表时,往往都会失去不同的后果?

答: 但这并不是阐明哈希表不稳固,这是 go 语言成心这样设计的, 他在运行时为哈希表遍历引入不确定性,也是通知所有应用 go 语言的使用者,程序不要依赖于哈希表的稳固遍历。

参考

https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-for-range/

正文完
 0