2012-02-17 10 views
1

これはかなりニッチな問題ですが、私は現在、golangでコンベンションベースの設定ストレージライブラリを作成しようとしています。私のライブラリ関数を呼び出す何か(例えば"github.net/author/projectname/pkg")を保存したい実行中のパッケージ名をプログラムで決定することができれば、素晴らしいAPIになるでしょう。main.mainパッケージの名前を調べることはできますか?

Pythonでは、inspectモジュール、または__main__.__file__でも同様のことが達成でき、ファイルシステムを見ています。

コードは次のようになります:

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()) 

私が入れた場合は、以下の機能を使用する場合は、同様の情報を得ることができます

答えて

4

上記のコード(1行目がに変更されています

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

するか、それが印刷されます:私はGOROOTにインストールされている(ランダムに)選ばれた囲碁ライブラリに)は、それが印刷さ

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

第一ライン上のファイル名、および2行目、あなたが探している情報が含まれているようです。

二つの問題があります。

  • は機能が自動的にパッケージmainで定義された任意の関数Fのコンパイラ

  • によってインライン化されている場合、それは誤った結果を与える可能性があり、関数名はちょうどmain.Fです。たとえば、main()からruntime.Caller(0)が呼び出された場合、main()関数がGOROOT/src/github.com/mattn/go-gtk/...にあるGoファイルで定義されていても、関数名はmain.mainになります。この場合、の出力よりもruntime.Callerの出力が有効です。

関連する問題