6.4 defer 和追踪

Kesa...大约 1 分钟

6.4 defer 和追踪

defer

defer 允许推迟语句到函数返回之前的时候才执行。

例: 06_4_defer.goopen in new window

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可以实现代码追踪,在进入离开时打印信息

例: 06_4_defer_tracing.goopen in new window

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

简洁版, 06_4_defer_tracing2.goopen in new window

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()
}

记录参数和返回值

06_4_defer_logvalue.goopen in new window

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