Golang 實(shí)現(xiàn)獲取當(dāng)前函數(shù)名稱(chēng)和文件行號(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使用定時(shí)器時(shí)如何避免潛在的內(nèi)存泄漏陷阱
這篇文章來(lái)和大家一起探討一下Go?中如何高效使用?timer,特別是與select?一起使用時(shí),如何防止?jié)撛诘膬?nèi)存泄漏問(wèn)題,感興趣的可以了解下2024-01-01
golang?gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例
這篇文章主要為大家介紹了golang?gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Golang中omitempty關(guān)鍵字的具體實(shí)現(xiàn)
本文主要介紹了Golang中omitempty關(guān)鍵字的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Go?http.Transport?主要參數(shù)說(shuō)明
這篇文章主要為大家介紹了Go?http.Transport主要參數(shù)說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
詳解如何使用Go語(yǔ)言進(jìn)行文件監(jiān)控和通知
在Go語(yǔ)言中,文件監(jiān)控通常涉及到文件系統(tǒng)事件的監(jiān)聽(tīng),文件或目錄的狀態(tài)發(fā)生變化(如創(chuàng)建、刪除、修改等)時(shí),你的程序需要得到通知,所以本文給大家介紹了如何使用Go語(yǔ)言進(jìn)行文件監(jiān)控和通知,需要的朋友可以參考下2024-06-06
使用Go語(yǔ)言實(shí)現(xiàn)配置文件熱加載功能
這篇文章主要介紹了使用Go語(yǔ)言實(shí)現(xiàn)配置文件熱加載功能,以及配置文件熱加載包的實(shí)現(xiàn)思路,需要的朋友可以參考下2018-03-03
golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架)
這篇文章主要介紹了golang API開(kāi)發(fā)過(guò)程的中的自動(dòng)重啟方式(基于gin框架),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Golang實(shí)現(xiàn)Mongo數(shù)據(jù)庫(kù)增刪改查操作
本文主要介紹了Golang實(shí)現(xiàn)Mongo數(shù)據(jù)庫(kù)增刪改查操作,我們使用了 MongoDB的官方Go驅(qū)動(dòng)程序,實(shí)現(xiàn)了插入、查詢(xún)、更新和刪除操作,感興趣的可以了解一下2024-01-01

