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 [[email protected] pro]# go run arg.go
2 [[email protected] pro]# go run arg.go
3 14
时间: 2024-10-10 17:22:36

golang 之 defer(统计函数执行时间)的相关文章

关于golang的defer的练习

golang的defer怎么说.大意就是在函数return后.函数关闭前.按照filo的顺序来执行的关键字 上代码: package main import ( "fmt" ) func main() { // a() fmt.Println(c()) // b() // fmt.Println(d()) } func c() (i int) { defer func() { i++ }() defer fmt.Println("this:", i) return

golang之defer

概述 对于资源释放,有很多不同的实现方式,不同语言也有不同的惯用方法. C语言 :手动管理 Golang :defer Python :上下文管理器contexManager C++ : 作用域和析构函数 Rust :所有权和drop trait 如果了解上面几种语言的童鞋应该知道, C语言资源管理是比较麻烦的,一旦资源使用过程中出错,就可能造成资源泄漏. Golang通过defer,即使过程中panic,也可以释放资源. Python通过上下文管理器,主要是两个magic function`_

golang中defer的使用规则

在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用.因此,defer通常用来释放函数内部变量. 为了更好的学习defer的行为,我们首先来看下面一段代码: func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName)if err != nil {retu

轻松掌握golang的defer机制

什么是defer? 如果熟悉python的话,会感觉defer在某种程度上有点类似于python中的上下文管理,golang中的defer是golang提供的一种延迟调用的机制,可以让一个函数在当前函数执行完毕(即使出错)后执行. 因此显然defer对于那些io流操作很有用,因为io流操作结束之后是需要close的,而程序员很容易忘记,所以defer是个好东西,经常用在资源清理.文件关闭.锁释放等等. defer的用法 直接把一个函数调用放在defer后面即可. f, err := os.Ope

golang中defer的正确使用方式(源自深入解析go)

3.4 defer关键字 defer和go一样都是Go语言提供的关键字.defer用于资源的释放,会在函数返回之前进行调用.一般采用如下模式: f,err := os.Open(filename) if err != nil { panic(err) } defer f.Close() 如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用. 不过如果对defer的了解不够深入,使用起来可能会踩到一些坑,尤其是跟带命名的返回参数一起使用时.在讲解defer的实现之前先看

golang defer 延后执行什么

对于golang的defer,我们已经知道,defer定义的语句可以延后到函数返回时执行. 经常用在文件的关闭,锁的释放等场景中.而且defer定义的语句即使遇到panic也会执行.这样,可以执行必要的清理工作,甚至使用recover()捕获异常. 以前使用defer经常这样用: defer close() 或者 defer func(){ //do something... }() 本文介绍defer使用函数返回值(也是函数)作为延后执行内容时的情况. 请看例子代码: package main

Python 装饰器总结

装饰器总结 前提 使用装饰器的前提在于Python提供的特性: 函数即对象,可以进行传递: 函数可以被定义在另外一个函数中: 可以通过一个例子来了解: def get_animal(name='dog'): def dog(): return 'this is a dog' def cat(): return 'this is a cat' # 返回函数对象 if name == 'dog': return dog elif name == 'cat': return cat else: ret

Python装饰器笔记

DRY(Don't Repeat Yourself)原则: 一般是指在写代码的时候尽量避免重复的实现.违反DRY原则导致的坏处很容易理解,例如维护困难,修改时一旦遗漏就会产生不易察觉的问题. 一.函数装饰器 1.从Python内层函数说起 使用内层函数的三个好处 封装 贯彻DRY原则 闭包和工厂函数 1.封装 def outer(num1): def inner_increment(num1): # hidden from outer code return num1 + 1 num2 = in

在退出作用域时做一些事

Boost.ScopeExit库  由于种种原因,C++中没有Java或C#中的try{}finally{}语句,虽然有SEH,可以实现finally效果,但是可定制性太差,不尽人意. SEH实现的finally语句 __try { throw std::bad_exception(); } __finally { cout << "in finally" << endl; } 使用Boost.ScopeExit库可以完美实现这一功能,功能类似于Golang的d