go defer 延迟语句

即时求值的变量快照
使用 defer 只是延时调用函数,此时传递给函数里的变量,不应该受到后续程序的影响。

比如这边的例子

import "fmt"

func main() {
    name := "go"
    defer fmt.Println(name) // 输出: go

    name = "python"
    fmt.Println(name)      // 输出: python
}

如果 defer 后面跟的是匿名函数,情况会有所不同, defer 会取到最后的变量值

package main
import "fmt"
func main() {
    name := "go"
    defer func(){
    fmt.Println(name) // 输出: python
}()
    name = "python"
    fmt.Println(name)      // 输出: python
}

多个defer 反序调用
多个defer 是反序调用的,有点类似栈一样,后进先出

defer 与 return 孰先孰后

import "fmt"
var name string = "go"
func myfunc() string {
    defer func() {
        name = "python"
    }()
    fmt.Printf("myfunc 函数里的name:%s\n", name)
    return name
}
func main() {
    myname := myfunc()
    fmt.Printf("main 函数里的name: %s\n", name)
    fmt.Println("main 函数里的myname: ", myname)
}
输出如下

myfunc 函数里的name:go
main 函数里的name: python
main 函数里的myname:  go

那就是 defer 是return 后才调用的。所以在执行 defer 前,myname 已经被赋值成 go 了。

posted @ 2023-05-10 19:31  codestacklinuxer  阅读(10)  评论(0编辑  收藏  举报