Golang函数执行模板(log,耗时,panic)

有些函数执行前后,需要加日志、记录耗时、还要处理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, now, time.Now())
	return ret, err
}

func (w *worker) elasped(name string, beginTime, endTime time.Time) {
	log.Printf("[worker.Run()] 函数:%s 耗时:%f 秒 \n",
		name, endTime.Sub(beginTime).Seconds())
}

没多少东西,我也就处理func(...interface{}) (int, error)这类函数,其它没管了。

BLOG: http://blog.csdn.net/xcl168

MAIL: [email protected]

时间: 2024-07-31 19:29:34

Golang函数执行模板(log,耗时,panic)的相关文章

GO开发[四]:golang函数

函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量 c. 匿名函数 d. 多返回值 定义函数类型type: package main import "fmt" type add_func func(int, int) int func add(a, b int) int { return a + b } func sub

Golang记录、计算函数执行耗时、运行时间的一个简单方法

// 写超时警告日志 通用方法 func TimeoutWarning(tag, detailed string, start time.Time, timeLimit float64) {   dis := time.Now().Sub(start).Seconds()   if dis > timeLimit {     log.Warning(log.CENTER_COMMON_WARNING, tag, " detailed:", detailed, "Time

Golang通过自定义函数实现模板的包含

Golang通过自定义函数实现模板的包含 Golang原生不支持例如revel中指令{{ template "header.html" }} ? 1 package main import ( ? 1 2 3 4 "html/template" "log" "os" "io/ioutil" ) func main() { ? 1 2 3 s := ParseTmplateToStr("src/1.

golang 函数和方法

由于自己是搞python开发的,所以在学习go时,当看到函数和方法时,顿时还是挺蒙的,因为在python中并没有明显的区别,但是在go中却是两个完全不同的东西.在官方的解释中,方法是包含了接收者的函数. 定义 函数的格式是固定的Func + 函数名 + 参数 + 返回值(可选) + 函数体 Func main( a, b int) (int) { } 而方法会在方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至我们可以

electron/nodejs实现调用golang函数

https://www.jianshu.com/p/a3be0d206d4c 思路 golang 支持编译成c shared library, 也就是系统中常见的.so(windows下是dll)后缀的动态链接库文件. c++可以调用动态链接库,所以基本思路是golang开发主要功能, c++开发插件包装golang函数,实现中转调用 对于类型问题, 为了方便处理, 暴露的golang函数统一接受并返回字符串, 需要传的参数都经过json编码, 返回值亦然. 这里实现了3种调用方式, 同步调用,

golang 函数-defer-recover-panic

函数 1.函数的定义 package main import "fmt" func add(a int, b int) int {  // 当函数参数类型相同时,除最后一个外其他类型可省略.                             // add(a int,b int) == add(a,b int) return a+b } func main(){ fmt.Println(add(1,2)) } //执行结果: # go run func.go 3 2.函数的多返回

0722-----C++Primer听课笔记----------虚函数和模板

1.虚指针和虚函数表 1.1 不含有任何数据成员或者虚函数的class或者struct大小为1,含有虚函数的对象在基地址部分有一个vptr,指向虚函数表,因此大小为4个字节. 1.2 动态绑定的原理:假设派生类和基类存在覆盖的关系(基类中定义了虚函数),那么派生类在虚函数表中,会覆盖掉基类相应的虚函数.当程序执行的时候,根据基类指针找到vptr,根据vptr找到vtable,然后找到相应的版本去执行.所以执行的是覆盖的版本,而具体被哪个版本覆盖是由具体的对象类型所决定的,所以才实现了根据对象的具

使用限制函数执行频率的函数代理

使用代理限制函数的调用频率 假设一个经典的CURD页面上,要做一个Ajax异步查询功能. 放一个查询按钮,点击查询,系统会到远程服务端请求数据,一秒之后返回查询结果. 很快,功能实现了! 但假如用户一秒内点击了三次查询,会发生什么? 为了解决这个问题,我们可能会在用户点击查询之后禁用查询按钮,或者在处理查询时上锁,返回结果后再把锁放开. 很好,做到这里,已足够日常使用. 这里只解决了一个问题:按钮的点击.而输入框的输入.选择框的变化.鼠标的移动.滚轮的滚动,这些事件触发频率高的问题怎么解决? 为

虚函数和模板编程的一点共性和特征模板的一个例子

最近在看元编程中,对虚函数和模板编程有一点点感悟,写一篇博客简单总结一下. 虚函数和模板是C++里面很棒的特征,他们都提供了一种方法,让程序在编译中完成一些计算,去掉的这些计算在比较low的编程方式中,是需要在程序运行中执行的.在这里,我要强调的是:"在编译过程中完成一些计算". 我会举两个例子,一个是虚函数的,比较简单,另一个例子是关于特征模板的,在例子中,根据模板参数的类型自动选择模板的底层数据结构. 第一个例子是比较简单的虚函数的例子,有很多种水果的类型,我们有一个函数要展示他们