[Golang]defer与return的返回顺序问题

defer在go中是一个全新的关键字,他的作用在于能够在go函数返回之后,延迟加载defer函数中的内容。这里对defer的作用进行如下测试:

  1. defer用于延迟加载
    1
    2
    3
    4
    5
    6
    7
    8
    9
    func test2() {
    defer func() {
    fmt.Printf("你好,世界!\n")
    }()
    fmt.Printf("哈哈,我在外面\n")
    }
    func main() {
    test2()
    }
    输出结果如下:
    upload successful

2.函数中有多个defer函数
当函数中有多个defer时,从上到下,根据“先进后出”的原则 得到结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func test2() {
defer func() {
fmt.Printf("你好,世界!\n")
}()
defer func() {
fmt.Printf("我是第二个defer函数\n")
}()
fmt.Printf("哈哈,我在外面\n")
}
func main() {
// fmt.Printf("main函数里的name111: %s\n", name)
// myname := myfunc()
// fmt.Println("main 函数里的myname333: ", myname)
// fmt.Printf("main函数里的name222: %s\n", name)
// fmt.Println("main 函数里的myname: ", myname)
test2()
}

upload successful

3.当defer与return均存在时,return先返回结果,再执行defer中的内容。实验如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var name string = "go"

func myfunc() string {
defer func() {
name = "python"
}()
fmt.Printf("myfunc 函数里的name: %s\n", name)
return name
}

func main() {
fmt.Printf("main函数里的name111: %s\n", name)
myname := myfunc()
fmt.Println("main 函数里的myname333: ", myname)
fmt.Printf("main函数里的name222: %s\n", name)
fmt.Println("main 函数里的myname: ", myname)
}

upload successful