Go 程序怎么在运行时得到包名

2022-10-05 21:50:13 +08:00
 wencan
需求是获取调用栈的包名、函数名。
目前利用 runtime.Callers 和 runtime.CallersFrames ,得到的函数名格式为:<packageName>.<functionName>。比如:github.com/user/project.function
但是……
github.com 支持仓库名带符号"."。
函数内嵌套的函数,和结构体方法的名称,也带符号"."。
那么可能得到下面的完整函数名:
github.com/user/my.project.mystruct.method
现在要做的,就是提取出其中的包名,和不带包名的函数名。
2438 次点击
所在节点    Go 编程语言
3 条回复
janxin
2022-10-05 22:58:08 +08:00
runtime 肯定没问题,不过不是只有这个啊

别忘记还有一个 runtime/debug.ReadBuildInfo
Trim21
2022-10-05 23:27:04 +08:00
'/' 只会出现在包名里,先用'/'分割,然后最后一个元素是 包名 + '.' + 函数名,再用 '.' 分割最后一个元素,然后把包名拼起来就行了。

import (
"runtime"
"strings"
)

func GetCallerPackage() string {
pc, _, _, ok := runtime.Caller(1)
if ok {
name := runtime.FuncForPC(pc).Name()
slashIndex := strings.LastIndexByte(name, '/') + 1

pointIndex := strings.IndexByte(name[slashIndex:], '.')

return name[:slashIndex+pointIndex]
}

return "<unknown>"
}
lysS
2022-10-06 16:47:40 +08:00
额。。。。这不是常量吗?自己引用了什么包是确定的,可以直接写死

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/884806

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX