2012-02-17 1 views
1

이것은 상당히 틈새 문제이지만 현재 golang을 사용하여 컨벤션 기반 설정 저장 라이브러리를 작성하려고합니다. 내 라이브러리 함수를 호출하는 무언가 (예 : "github.net/author/projectname/pkg")를 저장하려는 실행중인 패키지 이름을 프로그래밍 방식으로 확인할 수 있다면 큰 도움이 될 것입니다.main.main 패키지의 이름을 검사 할 수 있습니까?

파이썬을 사용하면 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

위 코드 (첫 번째 줄은로 변경됨)

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

를하거나 인쇄 : 나는 GOROOT에 설치 한 A (무작위로) 선택된 이동 라이브러리에이)가 인쇄

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(0)이 호출 된 경우 main() 함수가 GOROOT/src/github.com/mattn/go-gtk/...에있는 Go 파일에 정의되어 있더라도 함수 이름은 main.main입니다. 이 경우 runtime.Caller의 출력이 runtime.FuncForPC의 출력보다 유용합니다.