1. 程式人生 > >Golang函式執行模板(log,耗時,panic)

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]

相關推薦

Golang函式執行模板(log,耗時,panic)

         有些函式執行前後,需要加日誌、記錄耗時、還要處理panic,都是些重複性的東西。  所以弄了個模板式的東西,碰到這類需求,直接把相關函式和引數,丟到run函式去就不用管了,省得浪費時

golang程式使用pprof遠端檢視httpserver執行堆疊,cpu耗時等資訊

pprof是個神馬玩意兒? pprof - manual page for pprof (part of gperftools) 是gperftools工具的一部分 These tools are for use by developers so that they ca

golang一行程式碼計算函式執行時間

package mainimport(        "fmt"        "time")func main(){        defer timeCost(time.Now())        fmt.Println("start program")        time.Sleep(5*time.

gohook 一個支援執行時替換 golang 函式的庫實現

執行時替換函式對 golang 這類靜態語言來說並不是件容易的事情,語言層面的不支援導致只能從機器碼層面做些奇怪 hack,往往艱難,但如能成功,那掙脫牢籠帶來的成就感,想想就讓人興奮。 gohook gohook 實現了對函式的暴力攔截,無論是普通函式,還是成員函式都可以強行攔截替換,並支援回撥原

SQL2012數據庫還原失敗System.Data.SqlClient.SqlError: 無法執行 BACKUP LOG,因為當前沒有數據庫備份

覆蓋 技術 界面 with inf 分享圖片 gpo cover 一個 在一次數據庫還原的操作過程中遇到如上錯誤,去百度了下找到了對應的解決方法 第一個: 在還原完整備份時候,在回復狀態狀態哪裏選擇 restore with norecovery ,尾日誌部分可選可不選

自動化 - gulp是一個工具包,可幫助您在開發工作流程中自動執行痛苦或耗時的任務

gulp是什麼? 自動化 - gulp是一個工具包,可幫助您在開發工作流程中自動執行痛苦或耗時的任務。 與平臺無關 - 整合內置於所有主要IDE中,人們正在使用gulp與PHP,.NET,Node.js,Java和其他平臺。 強大的生態系統 -

vue中各選項及鉤子函式執行順序

在vue中,例項選項和鉤子函式和{{}}表示式都是不需要手動呼叫就可以直接執行的。 vue的生命週期如下圖: 在頁面首次載入執行順序有如下: beforeCreate                //在例

JS函式執行

函式定義:     function name(){         #內容 }     普通函式:      

JS檔案的**.js和**.min.js的區別,以及js函式執行的順序

①**.js和**.min.js的區別 引用 Q: .js和.min.js檔案分別是什麼? A: .js是JavaScript 原始碼檔案, .min.js是壓縮版的js檔案。 Q:為什麼要壓縮為.min.js檔案? 減小體積 .min.js檔案經過壓縮,相對編譯前的js檔案體積較小

es6箭頭函式以及模板字串的拼接

es6箭頭函式:  //1.具有一個簡單引數的函式 var single=a=>a console.log(single('hello word')); //2.沒有引數的需要在箭頭前加上小括號 var logs=()=>{ console.log('這個是沒有

Jprofile - 檢視執行緒CPU耗時

1. 點選CPU views -> Call Tree -> Press Record   2.執行應用程式操作就可以看到該步操作在後臺的耗時情況,Thread Status可以選擇,區別如下(例如查詢DB)   Runnable &nbs

尤拉函式模板

#include <iostream> #include <cmath> using namespace std; int oula(int n) { int ans=n; int i; for(i=2;i<=sqrt(n);i++) {

Python-自定義裝飾器,使用裝飾器記錄函式執行次數,一種埋點的實現形式

什麼是裝飾器? 裝飾器本質是一個函式,它可以在不改變原來的函式的基礎上額外的增加一些功能。如常見的@classmethod,@staticmethod等都是裝飾器,接下來記錄下如何自定義個裝飾器: 剛剛說過了,裝飾器的本質就是一個函式,所有想要自定義一個裝飾器,首先自定義一個函式

JS:函式執行順序

for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } console.log(i + "===="); 這個列印結果不是 0 1 2

靜態塊、例項塊、建構函式執行順序

靜態塊、例項塊、建構函式的執行順序:     1.先執行靜態方法塊    2.再執行例項方法塊    3. 再執行建構函式塊 同一個類下不管new多少次,該類下的靜態塊只執行一次(但是一次可以執行多個) 不管是new幾個類

golang函式棧空間分佈看defer,你就不會再錯了

    defer 是golang 面試常會面的一個點,但是實在話, 這玩意沒多大用,特別是高頻下,很多廠的優化點之一就是defer。但是這玩意複雜起來,你確實不一定能都答對,到底怎麼分析defer ,才能保證返回值正常呢?其實明白 golang 的函式棧空間佈局,就不會再弄錯了

裝飾器寫函式執行時間

import time from functools import wraps def print_use_time(func): @wraps(func) def _init(*args,**kwargs): start = time.time()

golang 函式以及函式和方法的區別

golang 函式以及函式和方法的區別 2016年12月11日 20:12:54 D_Guco 閱讀數:10426更多 個人分類: golang 所屬專欄: golang學習 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https:/

Qt獲取函式執行的時間

通過QTime的start()和elapsed()方法獲取for迴圈的毫秒數: #include <QApplication> #include <QTime> #include <QDebug> int main(int argc,char *argv[]