runtime.Caller()返回函数执行程序计数pc、执行的文件名和所在行数
runtime.FuncForPC()传入pc,得到运行的函数指针
文件结构
- 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)
}
当在main.go文件中调用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调取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函数所在函数名、文件位置、文件名