Go语言defer语句的用法(附带实例)
在 Go 语言中,使用 defer 语句可以延迟处理其后定义的函数或语句。如果在某个函数中使用 defer 语句,则紧跟在该语句后面的程序在 defer 所在的函数即将返回时执行。
代码如下:
1) 共有 3 个自定义函数 first()、second() 和 third(),使用 defer 语句延迟调用函数 first()。second() 和 third() 函数是延迟函数的参数,正常输出“我是second”和“我是third”。second() 和 third() 两个函数的返回值和“我是first”在函数结束时输出。
2) 在调用 second() 函数时,传入的参数 num 的值是 10,后面对 num 值的修改不影响 second() 函数的返回值。在调用 third() 函数时,参数 num 的值修改为 20,所以在调用两个函数时,实参的值是不同的。
Go语言多个defer语句的执行顺序
在函数中使用多个 defer 语句时,当该函数即将返回时,多个延迟处理的语句将按 defer 语句的逆序执行。也就是说,先使用 defer 的语句后执行,后使用 defer 的语句先执行。代码如下:
package main
import (
"fmt"
)
func main() {
fmt.Println("程序开始")
defer fmt.Println(1) // 最后调用
defer fmt.Println(2) // 其次调用
defer fmt.Println(3) // 最先调用
fmt.Println("程序结束")
}
运行结果如下:
程序开始
程序结束
3
2
1
Go语言延迟函数的参数
defer 语句中的内容虽然在函数结束时执行,但如果延迟函数有参数则先计算参数的值。代码如下:
package main
import (
"fmt"
)
func first(num int) int { // 定义first()函数
fmt.Println("我是 first")
return num + 10
}
func second(num int) int { // 定义second()函数
fmt.Println("我是 second")
return num + 20
}
func third(num int) int { // 定义third()函数
fmt.Println("我是 third")
return num + 30
}
func main() {
num := 10
fmt.Println("程序开始")
defer fmt.Println(second(num))
num = 20
defer fmt.Println(third(num))
defer fmt.Println(first(num))
fmt.Println("程序结束")
}
运行结果如下:
程序开始
我是 second
我是 third
程序结束
50
30
我是 first
1) 共有 3 个自定义函数 first()、second() 和 third(),使用 defer 语句延迟调用函数 first()。second() 和 third() 函数是延迟函数的参数,正常输出“我是second”和“我是third”。second() 和 third() 两个函数的返回值和“我是first”在函数结束时输出。
2) 在调用 second() 函数时,传入的参数 num 的值是 10,后面对 num 值的修改不影响 second() 函数的返回值。在调用 third() 函数时,参数 num 的值修改为 20,所以在调用两个函数时,实参的值是不同的。
Go语言匿名函数的延迟调用
使用 defer 语句延迟调用的函数可以是匿名函数,这种情况的应用比较广泛。代码如下:
package main
import (
"fmt"
)
func main() {
fmt.Println("程序开始")
defer func() {
fmt.Println("延迟调用")
}()
fmt.Println("程序结束")
}
运行结果如下:
程序开始
程序结束
延迟调用
1) 返回值未设置变量名
如果使用 defer 语句的函数有返回值,而且该返回值未设置变量名,那么在执行 defer 语句时不能修改返回值。代码如下:
package main
import (
"fmt"
)
func test() int {
var i int
defer func() {
i++
fmt.Println("defer2:", i)
}()
defer func() {
i++
fmt.Println("defer1:", i)
}()
return i
}
func main() {
fmt.Println("return:", test())
}
运行结果如下:
defer1: 1
defer2: 2
return: 0
2) 返回值设置变量名
如果使用 defer 语句的函数有返回值,并为该返回值设置变量名,那么在执行 defer 语句时可以修改返回值。代码如下:
package main
import (
"fmt"
)
func test() (i int) {
defer func() {
i++
fmt.Println("defer2:", i)
}()
defer func() {
i++
fmt.Println("defer1:", i)
}()
return i
}
func main() {
fmt.Println("return:", test())
}
运行结果如下:
defer1: 1
defer2: 2
return: 2
ICP备案:
公安联网备案: