[Golang]defer与return的返回顺序问题
defer在go中是一个全新的关键字,他的作用在于能够在go函数返回之后,延迟加载defer函数中的内容。这里对defer的作用进行如下测试:
- defer用于延迟加载
1 2 3 4 5 6 7 8 9
| func test2() { defer func() { fmt.Printf("你好,世界!\n") }() fmt.Printf("哈哈,我在外面\n") } func main() { test2() }
|
输出结果如下:
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() }
|
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) }
|