大家好,欢迎来到IT知识分享网。
代码如下:
package main import ( "fmt" "time" ) func main() { ch := make(chan string) go slowFunc2(ch) msg := <-ch fmt.Println("chan:", msg) fmt.Println("main func:i am not shown until slowFunc2() completes") time.Sleep(time.Second * 3) } func slowFunc2(c chan string) { time.Sleep(time.Second * 2) c <- "slowFunc2() finnished,order:1" fmt.Println("at slowFunc2:slowFunc2() finished,order:1") }
执行结果如下:
D:\Desktop\goTest>routineTest.exe chan: slowFunc2() finnished,order:1 main func:i am not shown until slowFunc2() completes at slowFunc2:slowFunc2() finished,order:1
从上面的这个执行结果,可以看到,
1 先是管道的内容,回到主函数,首先输出“chan: slowFunc2() finnished,order:1”
2 主函数继续执行,输出“main func:i am not shown until slowFunc2() completes”
3 并发的协程函数还在执行,因为主函数执行的慢(有等待延时),所以并发协程才有机会输出“at slowFunc2:slowFunc2() finished,order:1”。
如果把主函数的等待3秒去掉,那么执行可能主函数已经执行完毕消耗了,而并发的协程还没有执行完,也就没有机会打印输出了。
测试如下:
package main import ( "fmt" "time" ) func main() { ch := make(chan string) go slowFunc2(ch) msg := <-ch fmt.Println("chan:", msg) fmt.Println("main func:i am not shown until slowFunc2() completes") // time.Sleep(time.Second * 3) } func slowFunc2(c chan string) { time.Sleep(time.Second * 2) c <- "slowFunc2() finnished,order:1" fmt.Println("at slowFunc2:slowFunc2() finished,order:1") }
结果如下:
D:\Desktop\goTest>routineTest.exe chan: slowFunc2() finnished,order:1 main func:i am not shown until slowFunc2() completes
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/58279.html