在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 示例 6.8 defer.go: package main
import "fmt"
func main() {
function1()
}
func function1() {
fmt.Printf("In function1 at the top\n")
defer function2()
fmt.Printf("In function1 at the bottom!\n")
}
func function2() {
fmt.Printf("function2: Deferred until the end of the calling function!")
}
输出: In Function1 at the top
In Function1 at the bottom!
Function2: Deferred until the end of the calling function!
请将 defer 关键字去掉并对比输出结果。 使用 defer 的语句同样可以接受参数,下面这个例子就会在执行 defer 语句时打印 func a() {
i := 0
defer fmt.Println(i)
i++
return
}
当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出): func f() {
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
}
上面的代码将会输出: 关键字 defer 允许我们进行一些函数执行完成后的收尾工作,例如:
合理使用 defer 语句能够使得代码更加简洁。
使用 defer 语句实现代码追踪 一个基础但十分实用的实现代码执行追踪的方案就是在进入和离开某个函数打印相关的消息,即可以提炼为下面两个函数: func trace(s string) { fmt.Println("entering:", s) }
func untrace(s string) { fmt.Println("leaving:", s) }
以下代码展示了何时调用两个函数: 示例 6.10 defer_tracing.go: package main
import "fmt"
func trace(s string) { fmt.Println("entering:", s) }
func untrace(s string) { fmt.Println("leaving:", s) }
func a() {
trace("a")
defer untrace("a")
fmt.Println("in a")
}
func b() {
trace("b")
defer untrace("b")
fmt.Println("in b")
a()
}
func main() {
b()
}
输出: entering: b
in b
entering: a
in a
leaving: a
leaving: b
使用 defer 语句来记录函数的参数与返回值——利用了defer是在return后的特性哇!!! 下面的代码展示了另一种在调试时使用 defer 语句的手法(示例 6.12 defer_logvalues.go): package main
import (
"io"
"log"
)
func func1(s string) (n int, err error) {
defer func() {
log.Printf("func1(%q) = %d, %v", s, n, err)
}()
return 7, io.EOF
}
func main() {
func1("Go")
}
输出: Output: 2011/10/04 10:46:11 func1("Go") = 7, EOF
|
请发表评论