网站地图    收藏   

主页 > 专题教程 > go语言 >

go defer 关键字的需要注意的问题

来源:未知    时间: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

添加评论