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

 

时间: 2024-09-19 09:07:23

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

HTML5中defer和async的深入对比

在网站页面中,通常需要引入外部js资源,然而外部的js资源可能导致DOM阻塞,影响页面加载速度.通过异步或者延迟执行js,可以做到引用外部js资源而不阻塞DOM的目的.用法是直接在script标签中使用defer和async,那么它们两个有什么区别呢? 从字面上来理解,defer是延迟,而async则是异步(Asynchronous).w3c上这样解释defer和async:defer属性是一个布尔值的属性,当存在这个属性时,它指定的脚本将在页面解析之后执行1; async也是一个布尔值的属性,

zan 正式开源,异步+非阻塞的PHP框架

Zan PHP Framework Zan PHP是基于PHP协程的网络服务框架,提供最简单的方式开发面向C10K+的高并发HTTP服务或SOA服务. 核心特效 基于 yield 实现了独立堆栈的协程 类似于 Golang 的并发编程模型实现 基于 swoole 提供非阻塞I/O服务 连接池支持(内置MySQL.Redis.syslog等多种组件) 类似Golang的defer机制解决由于异常导致的资源未释放.锁未释放的问题 可继承的View布局及组件化支持,方便完成bigPipe/bigRen

WebSocket 和 Golang 实现聊天功能

这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery 创建一个简单的web聊天应用程序.这个示例的源代码在 https://github.com/waylau/goChat . Running the example 运行示例 这个示例需要 Golang 开发环境. 该页面描述如何安装开发环境. 一旦你去启动和运行,您可以下载.构建和运行的例子, 使用命令: go get gary.burd.info/go-websocket-chat go-websocket-

HTML5 script元素async、defer异步加载使用介绍

我对于HTML5感到兴奋不已的原因之一是它实现了众多业界期待已久的特性.我们一直需要输入框显示空白提示,但都是用JavaScript来实现的.我们也想要整个块都变成可被点击,也是使用JavaScript来实现. 现在WebKit为HTML5实现了SCRIPT标签的async异步属性.过去我们使用各种JavaScript技巧来做这种事情,但现在新的属性让防止阻塞变得相对容易. async - HTML属性 如我前面提到的,添加async属性非常简单:   复制代码 代码如下: <!-- 指定asy

golang操作mongodb的方法_Golang

本文实例讲述了golang操作mongodb的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "launchpad.net/mgo"     "launchpad.net/mgo/bson" ) type Mail struct {     Id bson.ObjectId "_id"     Name string     Emai

使用Golang 搭建http web服务器

Golang在搭建web服务器方面的能力是毋庸置疑的.官方已经有提供net/http包为搭建http服务器做准备.使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置.至于这个包是否好用,这个就见仁见智了.你可以从net包开始封装一个web框架,当然也可以基于http包封装一个web框架.但是不论你是打算怎么样做,了解基本的net/http包一定是你借鉴的基础. 需求 我们要做两个简单的后台web系统.这个系统简单到只有两个页面:登陆和首页. 1 登陆页面   登陆页面

使用Docker和Golang进行便捷的MongoDB测试

本文讲的是使用Docker和Golang进行便捷的MongoDB测试,[编者的话]Docker的使用场景之一就是测试,在测试中,我们有时候会由于超时或者仅仅因为两个开发版本使用相同的数据库在同时运行而导致测试出错.本文以Golang和MongoDB为例,介绍了如何使用Docker来简化和改进单元测试. 背景我们正在不断寻找新技术来解决开发中遇到的问题.我们一直在使用Java+Spring,然而Java 8和Spring Boot为我们带来了新的生机,并改变了单一的Java应用为微服务模式(译者注

使用Golang+Mongodb打造你的第一个站点

很多人推荐MEAN来开发站点.MEAN就是M:mongodb,E:expressjs.A:angular最后的N:nodejs. 但是如果你亲身的体会到了js的嵌套回调的话你就会想换换别的办法了.虽然说可以用promise等框架 破解深深的嵌套,但毕竟不是语言本身支持的. 为什么说用Golang呢?因为Golang是一个有着动态语言的特点的静态语言.语法简单,语法糖就是尽量减少语法. 编译的时候就可以把错误排查掉很多.不用像动态语言那样运行的时候才掉进坑里. 在Golang众多的Web框架中发现

golang(4):编写socket服务,简单支持命令

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46881213 转载请必须注明出处! 1,socket服务 使用golang开发socket服务还是非常简单的. socket的库都封装好了. 参考文档: https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.1.md 2,简单例子 package main import (