golang slice循环永不停止!原因分析

2023年 7月 11日 63.8k 0

遍历数组的同时修改数组元素,能否得到一个永远都不会停止的循环?

func main() {
    s := []int{1, 2, 3}
    for _, v := range s {
        s = append(s, v)
    }
    fmt.Println(s)
}

输出:

[1 2 3 1 2 3]

发现上面代码并不会一直循环下去,说明在循环内改变了切片,但不影响循环次数。

原因分析

对于 for range 语句的实现,从编译器源码 gofrontend/go/statements.cc/For_range_statement::lower_range_slice()方法中可以看到有如下注释:

 // The loop we generate:
  //   for_temp := range
  //   len_temp := len(for_temp)
  //   for index_temp = 0; index_temp < len_temp; index_temp++ {
  //           value_temp = for_temp[index_temp]
  //           index = index_temp
  //           value = value_temp
  //           original body
  //   }

go代码表示如下:

sa := s
sv1 := 0
sn := len(sa)
v1 := sv1
v2 := nil
for ; sv1

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论