Golang 實(shí)現(xiàn)獲取當(dāng)前函數(shù)名稱和文件行號(hào)等操作
大家還是直接看代碼吧~
// 獲取正在運(yùn)行的函數(shù)名 func runFuncName()string{ pc := make([]uintptr,1) runtime.Callers(2,pc) f := runtime.FuncForPC(pc[0]) return f.Name() }
package main import( "fmt" "runtime" ) // 獲取正在運(yùn)行的函數(shù)名 func runFuncName()string{ pc := make([]uintptr,1) runtime.Callers(2,pc) f := runtime.FuncForPC(pc[0]) return f.Name() } func test1(){ i:=0 fmt.Println("i =",i) fmt.Println("FuncName1 =",runFuncName()) } func test2(){ i:=1 fmt.Println("i =",i) fmt.Println("FuncName2 =",runFuncName()) } func main(){ fmt.Println("打印運(yùn)行中的函數(shù)名") test1() test2() }
golang 的runtime庫(kù),提供Caller函數(shù),可以返回運(yùn)行時(shí)正在執(zhí)行的文件名和行號(hào):
func Caller(skip int) (pc uintptr, file string, line int, ok bool) {
Caller reports file and line number information about function invocations on the calling goroutine's stack. The argument skip is the number of stack frames to ascend, with 0 identifying the caller of Caller. (For historical reasons the meaning of skip differs between Caller and Callers.) The return values report the program counter, file name, and line number within the file of the corresponding call. The boolean ok is false if it was not possible to recover the information.
調(diào)用方法如下,返回的file為絕對(duì)路徑,line為行號(hào)。有了這個(gè)就可以在自己的日志等函數(shù)中添加這個(gè)記錄了。
_, file, line, ok := runtime.Caller(1)
補(bǔ)充:go 定位函數(shù)操作位置(文件名、函數(shù)名、所在行)
runtime.Caller()返回函數(shù)執(zhí)行程序計(jì)數(shù)pc、執(zhí)行的文件名和所在行數(shù)
runtime.FuncForPC()傳入pc,得到運(yùn)行的函數(shù)指針
文件結(jié)構(gòu)
- runtime - -file1.go - -file2.go - -main.go
main.go文件
package main import ( "fmt" "path" "runtime" ) func main(){ name, funcName, line := f2(0) fmt.Printf("file:%v;function:%v;line:%d",name,funcName,line) } func getLocation(skip int)(fileName ,funcName string ,line int){ pc, file, line, ok := runtime.Caller(skip) if !ok { fmt.Println("get info failed") return } fmt.Println(pc,file) fileName = path.Base(file) funcName = runtime.FuncForPC(pc).Name() return }
file1.go文件
package main func f1(skip int)(fileName ,funcName string ,line int){ fileName, funcName, line = getLocation(skip) return }
file2.go文件
package main func f2(skip int)(fileName ,funcName string ,line int){ return f1(skip) }
當(dāng)在main.go文件中調(diào)用f2時(shí)
func main(){ name, funcName, line := f2(3) fmt.Printf("file:%v;function:%v;line:%d",name,funcName,line) //output:file:main.go;function:main.main;line:10 }
f2調(diào)取f1,f1調(diào)取getLocation;f2->f1->getLocation經(jīng)歷了三層調(diào)用,所以在f2中傳入3時(shí),返回的當(dāng)前該函數(shù)的執(zhí)行位置及所在函數(shù)名、所在文件名
當(dāng)傳入2時(shí),返回的是(file:file2.go;function:main.f2;line:8)f2函數(shù)所在函數(shù)名、文件位置、文件名
當(dāng)傳入1時(shí),返回的是(file:file1.go;function:main.f1;line:4)f1函數(shù)所在函數(shù)名、文件位置、文件名
當(dāng)傳入0時(shí),返回的是(file:main.go;function:main.getLocation;line:16)getLocation函數(shù)所在函數(shù)名、文件位置、文件名
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go調(diào)用opencv實(shí)現(xiàn)圖片矯正的代碼示例
這篇文章主要為大家詳細(xì)介紹了Go調(diào)用opencv實(shí)現(xiàn)圖片矯正的代碼示例,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09Golang?使用os?庫(kù)的?ReadFile()?讀文件最佳實(shí)踐
這篇文章主要介紹了Golang使用os庫(kù)的ReadFile()讀文件最佳實(shí)踐,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Go底層channel實(shí)現(xiàn)原理及示例詳解
這篇文章主要介紹了Go底層channel實(shí)現(xiàn)原理及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08golang通過(guò)反射設(shè)置結(jié)構(gòu)體變量的值
這篇文章主要介紹了golang通過(guò)反射設(shè)置結(jié)構(gòu)體變量的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04goland中導(dǎo)包報(bào)紅和go mod問(wèn)題
這篇文章主要介紹了goland中導(dǎo)包報(bào)紅和go mod問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03使用Golang實(shí)現(xiàn)AES加解密的代碼示例
在現(xiàn)代的數(shù)據(jù)安全中,加密和解密是極其重要的一環(huán),其中,高級(jí)加密標(biāo)準(zhǔn)(AES)是最廣泛使用的加密算法之一,本文將介紹如何使用Golang來(lái)實(shí)現(xiàn)AES加密和解密,需要的朋友可以參考下2024-04-04Golang 使用map需要注意的幾個(gè)點(diǎn)
這篇文章主要介紹了Golang 使用map需要注意的幾個(gè)點(diǎn),幫助大家更好的理解和學(xué)習(xí)golang,感興趣的朋友可以了解下2020-09-09