6.4 defer 和追踪
...大约 1 分钟
6.4 defer 和追踪
defer
defer
允许推迟语句到函数返回之前的时候才执行。
func deferF() {
f1()
}
func f1() {
fmt.Println("f1 top")
defer f2()
fmt.Println("f1 bottom")
}
func f2() {
fmt.Println("f2")
}
f1 top
f1 bottom
f2
defer
语句可以接受参数
func f3() {
i :=
defer fmt.Println(i)
i++
return
}
// output
// 0
多个defer
行为被注册时,会以出栈的顺序执行(后进先出)
func f() {
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
}
// output
// 4 3 2 1 0
追踪
defer
可以实现代码追踪,在进入离开时打印信息
func deferTracing1() {
b()
}
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()
}
Entering: b
in b
Entering: a
in a
Leaving: a
Leaving: b
func deferTracing2() {
b2()
}
func trace2(s string) string {
fmt.Println("Entering: ", s)
return s
}
func untrace2(s string) {
fmt.Println("Leaving: ", s)
}
func a2() {
defer untrace2(trace2("a"))
fmt.Println("in a")
}
func b2() {
defer untrace2(trace2("b"))
fmt.Println("in b")
a2()
}
记录参数和返回值
func logvalue() {
f3("GO")
}
func f3(s string) (n int, err error) {
defer func() {
log.Printf("f1(%q) = %d, %v", s, n, err)
}()
return 7, io.EOF
}
2023/05/03 14:39:19 f1("GO") = 7, EOF
Powered by Waline v2.15.2