golang 之 defer(統計函數執行時間)


 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM