Могу ли я проанализировать имя пакета main.main? - PullRequest
1 голос
/ 17 февраля 2012

Это довольно нишевая проблема, но я сейчас пытаюсь написать библиотеку хранения настроек на основе соглашений с golang.Было бы неплохо, если бы я мог программно определить имя запущенного пакета, который хочет что-то сохранить (например, "github.net/author/projectname/pkg"), вызывая мою библиотечную функцию.

С Python подобное можно было бы достичь с помощью inspect модуль, или даже с __main__.__file__ и посмотреть на файловую систему.

1 Ответ

4 голосов
/ 17 февраля 2012

Вы можете получить похожую информацию, если используете следующие функции:

Код может выглядеть так:

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)) в (произвольно выбранную) библиотеку Go, которую я установил в GOROOT, она напечатает:

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-й строке, кажется, содержит информацию, которую вы ищете.

Есть две проблемы:

  • Может дать неверный результат, если функции автоматически встроены компилятором

  • Для любой функции F, определенной в пакете main, имя функции просто main.F. Например, если runtime.Caller(0) вызывается из main(), имя функции будет main.main, даже если функция main() определена в файле Go, найденном в GOROOT/src/github.com/mattn/go-gtk/.... В этом случае вывод из runtime.Caller более полезен, чем вывод из runtime.FuncForPC.

...