Go语言 go程释放(退出/销毁)

情况1:Go语言中,若在子go程中创建一个新 go程,子go程释放(销毁),新创建的go程不会随着子go程的销毁而销毁。原因:go程共享堆,不共享栈,go程由程序员在go的代码里显示调度(释放)。

实例:

package main
import ("fmt""time""runtime"
)
func test()  {for i:=0;i<10;i++{fmt.Printf("执行第%d次go程\n",i)time.Sleep(time.Second)}fmt.Println("go程执行完毕!")
}
func main() {go func() {go test()fmt.Println("------aaaaaaaa-------")time.Sleep(time.Second)fmt.Println("------go程结束--------------")/*不管是return  还是  runtime.Goexit(),效果一样*///returnruntime.Goexit()}()for{runtime.GC()}
}

从以上实例来看,虽然子go程已经退出,但是在子go程中新建的go程还在执行!原因:go程不共享栈,有自己独立的栈空间。子go程有自己的栈,在子go程中创建的新go程也有自己的栈。子go程的栈被释放(回收),由于栈独立,因此新创建的go程的栈不会被释放。

情况2:Go语言中,若在主go程中创建一个新 go程,主go程释放(销毁),新创建的go程随着主go程的销毁而销毁。原因:go程共享堆,不共享栈,go程由程序员在go的代码里显示调度(释放)。

实例:

package mainimport ("fmt""time"
)
func main() {go func() {for i:=0;i<10;i++{fmt.Printf("子go程:执行第%d次操作!\n",i)time.Sleep(time.Second)}}()for i:=0;i<3;i++{fmt.Println("--------aaaa------")time.Sleep(time.Second)}
}

从以上实例来看,虽然主go程退出,子go程马上退出。原因:go程共享堆。主go程和新创建的子go程共享一个堆。主go程退出,执行main对应的{ },堆退出。由于是共享堆,所以对应的子go程也会被销毁。

了解更多Go语言知识https://study.163.com/course/introduction/1210620804.htm


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部