昨天那个在for循环里append元素的同事,今天还在么?

简介: 昨天那个在for循环里append元素的同事,今天还在么?


昨天那个在for循环里append元素的同事,今天还在么?

问题

package main
import "fmt"
func main() {
 s := []int{1,2,3,4,5}
 for _, v:=range s {
  s =append(s, v)
  fmt.Printf("len(s)=%v\n",len(s))
 }
}

这个代码会造成死循环吗?

怎么答

  • 不会死循环for range其实是golang语法糖,在循环开始前会获取切片的长度 len(切片),然后再执行len(切片)次数的循环。

解释

  • for range的源码是
// 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
//   }
  • 上面的代码会被编译器认为是
func main() {
 s := []int{1,2,3,4,5}
 for_temp := s
 len_temp := len(for_temp)
 for index_temp := 0; index_temp < len_temp; index_temp++ {
  value_temp := for_temp[index_temp]
  _ = index_temp
  value := value_temp
  // 以下是 original body
  s =append(s, value)
  fmt.Printf("len(s)=%v\n",len(s))
 }
}
  • 代码运行输出
len(s)=6
len(s)=7
len(s)=8
len(s)=9
len(s)=10

所以说,那个同事用的是golang吗?

目录
相关文章
|
4月前
|
前端开发 Java API
【面试题】数组去重你想到几种办法呢?
【面试题】数组去重你想到几种办法呢?
|
Cloud Native
【刷题日记】1021. 删除最外层的括号
本次刷题日记的第 50 篇,力扣题为:1021. 删除最外层的括号,简单
|
数据库管理 Python
巧用for循环
巧用for循环
57 0
|
安全 小程序 Java
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(2)
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(2)
|
安全 小程序 Java
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(1)
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。(1)
|
JavaScript 前端开发 Java
面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!
面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!
116 0
面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!
List 集合遍历过程中删除元素。这个坑踩一遍就不要再踩了!
List 集合遍历过程中删除元素。这个坑踩一遍就不要再踩了!
|
前端开发
前端学习案例4-数组的删改方法2splice
前端学习案例4-数组的删改方法2splice
47 0
前端学习案例4-数组的删改方法2splice
|
前端开发
前端学习案例4-数组的删改方法2splice
前端学习案例4-数组的删改方法2splice
51 0
前端学习案例4-数组的删改方法2splice
《牛客刷题计划》旧键盘(Java数据结构Set和Map的使用)
《牛客刷题计划》旧键盘(Java数据结构Set和Map的使用)