1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func sum(a ...int) int { 9 defer trace("sum")() // note:不要忘記defer語句后的圓括號,否則本該在進入時執行的操作會在退出時執行,而本該在退出時執行的,永遠不會執行 10 total := 0 11 for _, val := range a { 12 total += val 13 } 14 return total 15 } 16 17 func trace(msg string) func() { 18 start := time.Now() 19 fmt.Printf("enter %s\n", msg) 20 return func() { 21 fmt.Printf("exit %s (%s)\n", msg, time.Since(start)) 22 } 23 } 24 25 func main() { 26 count := sum(3, 5, 9) 27 fmt.Printf("%d\n", count) 28 }
執行結果:
1 enter sum 2 exit sum (194.764µs) 3 17
利用defer修改函數的返回值:
1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func sum(a, b int) (result int) { 9 //defer trace("sum")() // note:不要忘記defer語句后的圓括號,否則本該在進入時執行的操作會在退出時執行,而本該在退出時執行的,永遠不會執行 10 defer func() { result += a }() //被延時執行的匿名函數甚至可以修改函數返回給調用者的返回值 11 result = 0 12 result += a 13 result += b 14 return result 15 } 16 17 func trace(msg string) func() { 18 start := time.Now() 19 fmt.Printf("enter %s\n", msg) 20 return func() { 21 fmt.Printf("exit %s (%s)\n", msg, time.Since(start)) 22 } 23 } 24 25 func main() { 26 count := sum(3, 8) 27 fmt.Printf("%d\n", count) 28 }
執行結果:
1 [root@docker pro]# go run arg.go 2 [root@docker pro]# go run arg.go 3 14