V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wencan
V2EX  ›  Go 编程语言

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

  •  
  •   wencan · 2022-10-05 21:50:13 +08:00 · 2265 次点击
    这是一个创建于 567 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是获取调用栈的包名、函数名。
    目前利用 runtime.Callers 和 runtime.CallersFrames ,得到的函数名格式为:<packageName>.<functionName>。比如:github.com/user/project.function
    但是……
    github.com 支持仓库名带符号"."。
    函数内嵌套的函数,和结构体方法的名称,也带符号"."。
    那么可能得到下面的完整函数名:
    github.com/user/my.project.mystruct.method
    现在要做的,就是提取出其中的包名,和不带包名的函数名。
    3 条回复    2022-10-06 16:47:40 +08:00
    janxin
        1
    janxin  
       2022-10-05 22:58:08 +08:00
    runtime 肯定没问题,不过不是只有这个啊

    别忘记还有一个 runtime/debug.ReadBuildInfo
    Trim21
        2
    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
        3
    lysS  
       2022-10-06 16:47:40 +08:00
    额。。。。这不是常量吗?自己引用了什么包是确定的,可以直接写死
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3558 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:05 · PVG 19:05 · LAX 04:05 · JFK 07:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.