Golang函数执行模板(log,耗时,panic)
发布时间:2020-12-16 18:44:24 所属栏目:大数据 来源:网络整理
导读:有些函数执行前后,需要加日志、记录耗时、还要处理panic,都是些重复性的东西。 所以弄了个模板式的东西,碰到这类需求,直接把相关函数和参数,丢到run函数去就不用管了,省得浪费时间。 先上个调用例子: //函数执行模板//author: Xiong Chuan Liang//date: 2015-
有些函数执行前后,需要加日志、记录耗时、还要处理panic,都是些重复性的东西。
所以弄了个模板式的东西,碰到这类需求,直接把相关函数和参数,丢到run函数去就不用管了,省得浪费时间。 先上个调用例子: //函数执行模板 //author: Xiong Chuan Liang //date: 2015-3-19 package main import ( "fmt" "log" "os" "utils" ) func main() { log.SetOutput(os.Stdout) w := utils.NewWorker() w.Run("myPrintf()",myPrintf,"aa","bb") } func myPrintf(args ...interface{}) (int,error) { fmt.Println("myPrintf() begin.") for _,arg := range args { fmt.Println("args:",arg) } fmt.Println("myPrintf() end.") panic("尝试抛出panic错误") return 0,nil } /* 运行结果: 2015/03/19 13:49:30 [worker.Run()] 函数: myPrintf() myPrintf() begin. args: aa args: bb myPrintf() end. 2015/03/19 13:49:30 [worker.Run()] panic: myPrintf() 尝试抛出panic错误 2015/03/19 13:49:30 [worker.Run()] 函数:myPrintf() 耗时:0.004000 秒 */调用还是很方便的,传入函数和附带的参数即可. 实现也很简单: //函数执行模板 //author: Xiong Chuan Liang //date: 2015-3-19 package utils import ( "fmt" "log" "time" ) type workerFunc func(...interface{}) (int,error) type worker struct { } func NewWorker() *worker { return &worker{} } func (w *worker) Run(name string,workerFunc workerFunc,args ...interface{}) (int,error) { now := time.Now() log.Println("[worker.Run()] 函数:",name) defer func() { if r := recover(); r != nil { log.Println("[worker.Run()] panic:n",name,"n",fmt.Sprint(r)) w.elasped(name,now,time.Now()) } }() ret,err := workerFunc(args...) w.elasped(name,time.Now()) return ret,err } func (w *worker) elasped(name string,beginTime,endTime time.Time) { log.Printf("[worker.Run()] 函数:%s 耗时:%f 秒 n",endTime.Sub(beginTime).Seconds()) } 没多少东西,我也就处理func(...interface{}) (int,error)这类函数,其它没管了。
BLOG: http://blog.csdn.net/xcl168 MAIL: xcl_168@aliyun.com (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |