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
分类:
golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人