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

 

posted on   阳台  阅读(2721)  评论(0编辑  收藏  举报

编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
历史上的今天:
2015-09-23 linux之iptable案例

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示