Module 我可以反思main.main包的名称吗?
这是一个相当小的问题,但我目前正试图用golang编写一个基于约定的设置存储库。如果我能以编程方式确定要存储某些东西的运行包名(例如调用我的库函数的github.net/author/projectname/pkg“),那将是一个巨大的API优势Module 我可以反思main.main包的名称吗?,module,go,packages,introspection,Module,Go,Packages,Introspection,这是一个相当小的问题,但我目前正试图用golang编写一个基于约定的设置存储库。如果我能以编程方式确定要存储某些东西的运行包名(例如调用我的库函数的github.net/author/projectname/pkg“),那将是一个巨大的API优势 使用Python,可以通过模块实现类似的功能,甚至可以通过\uuuuu main\uuuuu.\uuuu file\uuuuu.和查看文件系统来实现类似的功能。如果使用以下函数,可以获得类似的信息: 代码可能如下所示: pc, file, li
使用Python,可以通过模块实现类似的功能,甚至可以通过
\uuuuu main\uuuuu.\uuuu file\uuuuu.
和查看文件系统来实现类似的功能。如果使用以下函数,可以获得类似的信息:
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())
如果我将上述代码(第1行更改为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
或者打印:
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
第1行和第2行的文件名似乎包含您要查找的信息
有两个问题:
- 如果编译器自动内联函数,则可能会给出错误的结果
- 对于包
中定义的任何函数main
,函数名称仅为F
。例如,如果从main.F
main()。在这种情况下,
的输出比runtime.Caller
的输出更有用runtime.FuncForPC
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())
如果我将上述代码(第1行更改为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
或者打印:
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
第1行和第2行的文件名似乎包含您要查找的信息
有两个问题:
- 如果编译器自动内联函数,则可能会给出错误的结果
- 对于包
中定义的任何函数main
,函数名称仅为F
。例如,如果从main.F
main()。在这种情况下,
的输出比runtime.Caller
的输出更有用runtime.FuncForPC