Skip to content

0917main函数作用域与非main函数作用域的区别

ziyouzy edited this page Sep 18, 2020 · 1 revision

1.main作用域生命周期结束后,不会其内部其他作用域名的生命周期是否结束,而是将一切都退出

2.而非main作用域,只有当其内部其他子作用域生命周期都结束,才可以结束

第二种情况的过程存在如下规则

1.如果作用域与作用域之间存在共用内存的变量,则该变量需要销毁,销毁会在最内层作用域中完成,之后会伴随其所在环境作用域的销毁

接下来看如下例子:

func f3_0(){
    s :="test"
    func (){
        time.Sleep(time.Duration(3)*time.Second)
        s ="test3"
        fmt.Println("outside s:", s)
    }()
    s ="test2"
}

===

func f3_1(){
    s :="test"
    go func (){
        time.Sleep(time.Duration(3)*time.Second)
        s ="test3"
        fmt.Println("outside s:", s)
    }()
    s ="test2"
}

===

func f3_2(){
    s :="test"
    for i:=0;i<10;i++{
        time.Sleep(time.Duration(3)*time.Second)
        s ="test3"
        fmt.Println("outside s:", s)
    }
    s ="test2"
}

他们都是一样的

其实最合理的验证方式是这样:

func f3(){
    s :="test"
    go func (){
        time.Sleep(time.Duration(3)*time.Second)
        //s ="test3"
        fmt.Println("outside s:", s)
    }()
    fmt.Println("f3() done")
}

会先打印"f3() done",后打印"outside s: test"

由此可知,虽然外层函数结束了,但是因为存在着内部使用,其作用域并未销毁

函数本身和函数的作用域可以理解成肉体与灵魂的关系

而生命周期则象征着灵魂的存在与消亡,而不是肉体的

然而如果外层作用域存在多个变量,想要去验证他们是否存活,唯一的方式只有在内层调用他们

而在内层调用这件事本身,却又是让他们村魂的方式,因此则陷入了一个无法完美验证的悖论

至此,基础知识已经很扎实了,可以去基于流水线模式重构了吧,我在去看看文章

Clone this wiki locally