Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 我可以反思main.main包的名称吗?_Module_Go_Packages_Introspection - Fatal编程技术网

Module 我可以反思main.main包的名称吗?

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

这是一个相当小的问题,但我目前正试图用golang编写一个基于约定的设置存储库。如果我能以编程方式确定要存储某些东西的运行包名(例如调用我的库函数的github.net/author/projectname/pkg“),那将是一个巨大的API优势


使用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
    的输出更有用