Golang函式執行模板(log,耗時,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(){ #內容 } 普通函式:  
鏈式呼叫 小例項(附推導過程,關聯到 物件、 鏈式呼叫 、 函式執行 、 函式返回、形參實參、undefined)
var foo=function(m,n){ console.log(n); return{ foo:function(o){ console.log(o);
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[]