大家還是直接看代碼吧~
// 獲取正在運行的函數(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"
)
// 獲取正在運行的函數(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("打印運行中的函數(shù)名")
test1()
test2()
}
golang 的runtime庫,提供Caller函數(shù),可以返回運行時正在執(zhí)行的文件名和行號:
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為絕對路徑,line為行號。有了這個就可以在自己的日志等函數(shù)中添加這個記錄了。
_, file, line, ok := runtime.Caller(1)
補充:go 定位函數(shù)操作位置(文件名、函數(shù)名、所在行)
runtime.Caller()返回函數(shù)執(zhí)行程序計數(shù)pc、執(zhí)行的文件名和所在行數(shù)
runtime.FuncForPC()傳入pc,得到運行的函數(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時
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時,返回的當(dāng)前該函數(shù)的執(zhí)行位置及所在函數(shù)名、所在文件名
當(dāng)傳入2時,返回的是(file:file2.go;function:main.f2;line:8)f2函數(shù)所在函數(shù)名、文件位置、文件名
當(dāng)傳入1時,返回的是(file:file1.go;function:main.f1;line:4)f1函數(shù)所在函數(shù)名、文件位置、文件名
當(dāng)傳入0時,返回的是(file:main.go;function:main.getLocation;line:16)getLocation函數(shù)所在函數(shù)名、文件位置、文件名
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- Go語言的os包中常用函數(shù)初步歸納
- Golang 獲取文件md5校驗的方法以及效率對比
- GoLang中生成UUID唯一標識的實現(xiàn)
- 聊聊golang中多個defer的執(zhí)行順序
- Golang全局變量加鎖的問題解決
- go語言基礎(chǔ) seek光標位置os包的使用