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
