hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 文章 - 后端开发 - 正文 看Cosplay古风插画小姐姐,合集图集打包下载:炫龙网 · 炫龙图库

go defer(go耽误函数)引见_后端开发

2019-12-01后端开发ki4网23°c
A+ A-

Go言语的defer算是一个言语的新特征,最少对照现今主流编程言语云云。

defer语句挪用一个函数,这个函数实行会推延,直到外围的函数返回,或许外围函数运转到末了,或许响应的goroutine panic

每当defer实行的时刻,它背面的函数值(在go中函数是一个援用范例,是一等国民,能够赋值给变量)和函数参数会被求值,然则函数不会马上挪用,直到(↑)上述三种状况发作。 这就是defer的全部内容,没了,剩下就是defer的best practice

函数不会马上挪用

先从最简朴的入手下手:

func readFile(fileName string){
    f,err := os.Open(fileName)
    if err!=nil {
        return
    }
    defer f.Close()
    var content [1024]byte
    f.Read(content[:])
    fmt.Printf("%s",content)
}
func main() {
    readFile("test.data")
}

递次输出test.data前1024字节的内容。值得一提的是,相似这类open/close配对操纵是defer的惯用法。 这个例子解释了上面那句话的后半段

"然则函数不会被挪用"

由于假如defer背面的f.Close()没有耽误实行,那末文件描述符都封闭了,就不会读取到任何内容。

函数值和函数参数被求值,但函数不会马上挪用

下面这个例子行将解释上半段,它来自<>,稍作修正:

func trace(funcName string) func(){
    start := time.Now()
    fmt.Printf("function %s enter\n",funcName)
    return func(){
        log.Printf("function %s exit (elapsed %s)",funcName,time.Since(start))
    }
}
 
func foo(){
    defer trace("foo()")()
    time.Sleep(5*time.Second)
}
func main(){
    foo()
    foo()
}
/*
OUTPUT:
function foo() enter
function foo() exit (elapsed 5.0095471s)
function foo() enter
function foo() exit (elapsed 5.0005382s)
*/

为何foo会输出enter然后守候五秒左右再输出exit? 由于正如我们说的,

defer背面的函数值和参数会被求值然则现实函数挪用却要比及末了

这里函数值就是trace()返回的匿名函数,函数参数固然就是字符串字面值"foo()", 对trace("foo()")的求值会输出function foo() enter, 现实函数挪用trace("foo()")()即输出function foo() exit(elapsed x.x)会推延到return实行(假如return会更新返回值变量,则会在更新后才实行defer的函数)。

杂项

多说一点,假如存在多个defer语句,末了的defer的函数的实行递次与defer涌现的递次相反,如:

func main() {
    func1 := func(){
        fmt.Println("func1() execution deferred")
    }
    func2 := func(){
        fmt.Println("func2() execution deferred")
    }
    defer func1()
    defer func2()
    fmt.Println("strat\nworking...")
}
/*
OUTPUT:
strat
working...
func2() execution deferred
func1() execution deferred
*/

以上就是go defer(go耽误函数)引见的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
go defer(go耽误函数)引见_后端开发

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>