来源:未知 时间:2018-08-31 17:44 作者:小飞侠 阅读:次
[导读] 一: go defer 声明的代码在goroutine 没有执行: package main import ( fmt time ) var ch chan int func main() { ch =make(chan int) for i:=0;i10 ;i++ { go test(i) } for i:=0;i10 ;i++ { -ch } } func test(index int ){ time.Sleep(tim...
一: go defer 声明的代码在goroutine 没有执行: package main
import ( "fmt" "time" ) var ch chan int func main() {
ch =make(chan int) for i:=0;i<10 ;i++ { go test(i) } for i:=0;i<10 ;i++ { <-ch }
} func test(index int ){ time.Sleep(time.Second*1) defer fmt.Println("退出test ",index) ch<-index } 运行结果: 结果一:退出test 5 结果二:什么都没有 不是说好的defer 关键字 的意思是总会执行的吗?结果是defer 关键字并没有执行。 分析:当goroutine的主线程结束,goroutine 的子线程也会结束,剩下的无论什么的代码都不会执行。因为子线程已经结束。 即使是子线程的defer 关键字的代码也不一定会执行。 二:defer 关键字的执行顺序 package main
import ( "fmt" )
func main() { defer_call() }
func defer_call() { defer func() { fmt.Println("1") }() defer func() { fmt.Println("2") }() defer func() { fmt.Println("3") }() } 执行结果: 3 2 1 说明defer 关键字的执行顺序是后进先出 。平常写代码的时候应该注意defer 关键字的执行顺序。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com