2 Star 2 Fork 6

王布衣 / gox

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
stdlib.go 1.49 KB
一键复制 编辑 原始数据 按行查看 历史
王布衣 提交于 2023-10-22 08:48 . 增加获取func信息的函数
package runtime
import (
"reflect"
"runtime"
_ "unsafe"
)
const (
invalidProgramCounters = 0
invalidFunctionName = "<invalid runtimeFunctionForPC>"
unknownFilename = "<unknown file>"
unknownLine = -1
)
// Caller 获取正在运行的函数名, 文件名以及行号
func Caller() (function, file string, line int) {
pcs := make([]uintptr, 1)
runtime.Callers(2, pcs)
pc := pcs[0]
return FuncInfo(pc)
}
//go:linkname runtimeFunctionForPC runtime.FuncForPC
func runtimeFunctionForPC(pc uintptr) *runtime.Func
// 获取pc
func programCounters(v any) uintptr {
value := reflect.ValueOf(v)
var pc uintptr
if value.Kind() == reflect.Func {
pc = value.Pointer()
} else if value.Kind() == reflect.Uintptr {
pc = v.(uintptr)
} else {
pc = invalidProgramCounters
}
return pc
}
// FuncInfo 获取函数信息
//
// v 接收func类型和uintptr
func FuncInfo(v any) (nameOfFunction, filename string, lineNumber int) {
pc := programCounters(v)
if pc == invalidProgramCounters {
return invalidFunctionName, unknownFilename, unknownLine
}
f := runtimeFunctionForPC(pc)
if f == nil {
return invalidFunctionName, unknownFilename, unknownLine
}
nameOfFunction = f.Name()
filename, lineNumber = f.FileLine(pc)
return
}
// FuncName 获取函数名
func FuncName(v any) (nameOfFunction string) {
pc := programCounters(v)
if pc == invalidProgramCounters {
return invalidFunctionName
}
f := runtimeFunctionForPC(pc)
if f == nil {
return invalidFunctionName
}
return f.Name()
}
Go
1
https://gitee.com/quant1x/gox.git
git@gitee.com:quant1x/gox.git
quant1x
gox
gox
v1.21.1

搜索帮助