您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么在Golang中獲取當前函數名稱,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
golang 是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能。
// 獲取正在運行的函數名 func runFuncName()string{ pc := make([]uintptr,1) runtime.Callers(2,pc) f := runtime.FuncForPC(pc[0]) return f.Name() }
package main import( "fmt" "runtime" ) // 獲取正在運行的函數名 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("打印運行中的函數名") test1() test2() }
golang 的runtime庫,提供Caller函數,可以返回運行時正在執行的文件名和行號:
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.
調用方法如下,返回的file為絕對路徑,line為行號。有了這個就可以在自己的日志等函數中添加這個記錄了。
_, file, line, ok := runtime.Caller(1)
補充:go 定位函數操作位置(文件名、函數名、所在行)
runtime.Caller()返回函數執行程序計數pc、執行的文件名和所在行數
runtime.FuncForPC()傳入pc,得到運行的函數指針
- runtime - -file1.go - -file2.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 }
package main func f1(skip int)(fileName ,funcName string ,line int){ fileName, funcName, line = getLocation(skip) return }
package main func f2(skip int)(fileName ,funcName string ,line int){ return f1(skip) }
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調取f1,f1調取getLocation;f2->f1->getLocation經歷了三層調用,所以在f2中傳入3時,返回的當前該函數的執行位置及所在函數名、所在文件名
當傳入2時,返回的是(file:file2.go;function:main.f2;line:8)f2函數所在函數名、文件位置、文件名
當傳入1時,返回的是(file:file1.go;function:main.f1;line:4)f1函數所在函數名、文件位置、文件名
當傳入0時,返回的是(file:main.go;function:main.getLocation;line:16)getLocation函數所在函數名、文件位置、文件名
關于怎么在Golang中獲取當前函數名稱就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。