2011-08-13 10 views
56

함수가 주어지면 이름을 얻을 수 있습니까? 말 :이동에서 함수 이름을 얻는 방법?

func foo() { 
} 

func GetFunctionName(i interface{}) string { 
    // ... 
} 

func main() { 
    // Will print "name: foo" 
    fmt.Println("name:", GetFunctionName(foo)) 
} 

내가 runtime.FuncForPC 도움이 될 말을 들었다,하지만 난 그것을 사용하는 방법을 이해하지 못했습니다.

답변

95

을 내 자신의 질문에 대답 해 주셔서 죄송합니다. 해결책을 찾았습니다.

package main 

import (
    "fmt" 
    "reflect" 
    "runtime" 
) 

func foo() { 
} 

func GetFunctionName(i interface{}) string { 
    return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name() 
} 

func main() { 
    // This will print "name: main.foo" 
    fmt.Println("name:", GetFunctionName(foo)) 
} 
+0

이것이 작동하는 것처럼 보일 수도 있지만 여기에 몇 가지주의가 필요할 수 있습니다. .Pointer()에 대한 문서 "v의 Kind가 Func 인 경우 반환 된 포인터는 기본 코드 포인터이지만 단일 함수를 고유하게 식별 할만큼 충분하지는 않습니다. v가 무 함수 값 인 경우에만 결과가 0이라는 것을 보장합니다. " – jochen

+0

@jochen은 "단일 기능이 아닙니다"는 오 탐지 (즉, 다른 기능의 포인터)를 반환 할 수 있음을 의미합니까? – themihai

+0

@themihai 필자가 인용 한 문장은 https://golang.org/pkg/reflect/#Value.pointer에 대한 모든 문서입니다. 그러나 따옴표는 다른 함수에 대해 동일한 포인터를 얻을 수 있음을 나타냅니다. 그리고이 경우,'GetFunctionName'은 다른 함수들에 대해 같은 이름을 반환 할 수 있습니까? – jochen

5

하지 당신이 원하는 정확히, 그것은 "런타임"패키지를 사용하여 파일 이름과 줄 번호를 기록하지만 여기 내 Tideland가 일반적인 이동 도서관 (http://tideland-cgl.googlecode.com/)에서 할 방법이기 때문에 :

// Debug prints a debug information to the log with file and line. 
func Debug(format string, a ...interface{}) { 
    _, file, line, _ := runtime.Caller(1) 
    info := fmt.Sprintf(format, a...) 

    log.Printf("[cgl] debug %s:%d %v", file, line, info) 
+0

정말 도움이되지 않습니다. 호출 스택에 대한 정보는 필요 없지만 주어진 함수에 관해서는 알 수 있습니다. 가능한 경우 해당 함수 참조가 주어진 해당 PC를 얻는 방법을 알고 있다면 질문에 대한 대답이 될 것이라고 믿습니다. – moraes

관련 문제