這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。有些函數執行前後,需要加日誌、記錄耗時、還要處理panic,都是些重複性的東西。
所以弄了個模板式的東西,碰到這類需求,直接把相關函數和參數,丟到run函數去就不用管了,省得浪費時間。
先上個調用例子:
//函數執行模板//author: Xiong Chuan Liang//date: 2015-3-19package mainimport ("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: aaargs: bbmyPrintf() 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-19package utilsimport ("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: xcl_168@aliyun.com