美文网首页程序员
昨天那个在for循环里append元素的同事,今天还在么?

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

作者: 9號 | 来源:发表于2020-09-23 13:01 被阅读0次

    问题

    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吗?

    文章推荐:

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/bmznyktx.html