A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

情况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(),效果一样



  •                 */



  •                 //return



  •                 runtime.Goexit()







  •         }()



  •         for{



  •                 runtime.GC()



  •         }



  • }


从以上实例来看,虽然子go程已经退出,但是在子go程中新建的go程还在执行!原因:go程不共享栈,有自己独立的栈空间。

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

实例:


  • package main







  • import (



  •         "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程共享堆。


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马