我可以内省 main.main 包的名称吗?

发布于 2025-01-06 20:49:52 字数 305 浏览 0 评论 0原文

这是一个相当小众的问题,但我目前正在尝试使用 golang 编写一个基于约定的设置存储库。如果我能够以编程方式确定想要存储某些内容(例如“github.net/author/projectname/pkg”)并调用我的库函数的正在运行的包名称,那么这将是一个巨大的 API 福音。

使用Python,可以通过 inspect 模块实现类似的事情,甚至使用 __main__.__file__ 并查看文件系统。

This is a fairly niche problem, but I'm currently trying to write a conventions-based settings storage library with golang. It would be a great API boon if I could programmatically determine the running package name that wants to store something (eg "github.net/author/projectname/pkg") calling my library function.

With Python a similar thing could be achieved with the inspect module, or even with __main__.__file__ and a look at the file system.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不会写诗 2025-01-13 20:49:52

如果使用以下函数,您可以获得类似的信息:

代码可能如下所示

pc, file, line, ok := runtime.Caller(1)
if !ok { /*failed*/ }
println(pc, file, line, ok)

f := runtime.FuncForPC(pc)
if f == nil { /*failed*/ }
println(f.Name())

:我把上面的代码(与第一行更改为 runtime.Caller(0)) 到我安装在 GOROOT 中的(随机选择的)Go 库,它打印:

134626026 /tmp/go-build223663414/github.com/mattn/go-gtk/gtk/_obj/gtk.cgo1.go -4585 true
github.com/mattn/go-gtk/gtk.Init

或者它打印:

134515752 /home/user/go/src/github.com/mattn/go-gtk/example/event/event.go 12 true
main.main

文件名第一行和第二行似乎包含您正在查找的信息。

有两个问题:

  • 如果编译器自动内联函数,可能会给出不正确的结果

  • 对于任何函数 F 定义在包 main 中,函数名为 main.F。例如,如果从 main() 调用 runtime.Caller(0),则函数名称为 main.main,即使 >main() 函数在 GOROOT/src/github.com/mattn/go-gtk/... 中的 Go 文件中定义。在这种情况下,runtime.Caller 的输出比 runtime.FuncForPC 的输出更有用。

You can get similar information if you use the following functions:

The code may look like this:

pc, file, line, ok := runtime.Caller(1)
if !ok { /*failed*/ }
println(pc, file, line, ok)

f := runtime.FuncForPC(pc)
if f == nil { /*failed*/ }
println(f.Name())

If I put the above code (with the 1st line changed into runtime.Caller(0)) into a (randomly chosen) Go library which I have installed in GOROOT, it prints:

134626026 /tmp/go-build223663414/github.com/mattn/go-gtk/gtk/_obj/gtk.cgo1.go -4585 true
github.com/mattn/go-gtk/gtk.Init

Or it prints:

134515752 /home/user/go/src/github.com/mattn/go-gtk/example/event/event.go 12 true
main.main

The filename on the 1st line, and the 2nd line, seem to contain the information you are looking for.

There are two problems:

  • It may give incorrect result if functions are automatically inlined by the compiler

  • For any function F defined in package main, the function name is just main.F. For example, if runtime.Caller(0) is called from main(), the function name is main.main even if the main() function is defined in a Go file found in GOROOT/src/github.com/mattn/go-gtk/.... In this case, the output from runtime.Caller is more useful than the output from runtime.FuncForPC.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文