2011-08-13 16 views
56

関数を指定すると、その名前を取得できますか?セイ:Goで関数の名前を取得するには?

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が無関係の値である場合にのみ、結果がゼロであることを保証する。 – jochen

+0

@jochenは「単一機能ではない」とは、誤検出(つまり、別の機能のポインタ)を返す可能性があることを意味しますか? – themihai

+0

@themihai私が引用した文は、https://golang.org/pkg/reflect/#Value.Pointer sayについてのすべての文書です。しかし、この見積もりは、異なる関数に対して同じポインタを得ることができると思われるようです。これが当てはまる場合、 'GetFunctionName'は異なる関数のために同じ名前を返すでしょうか? – jochen

5

ない正確に何をしたい、それはファイル名と行番号を記録しますが、ここで私は、「ランタイム」のパッケージを使用して、私の干潟共通ゴー・ライブラリー(http://tideland-cgl.googlecode.com/)でそれを行う方法ですので:

+0

それは本当に役立たない。コールスタックに関する情報を取得する必要はありませんが、特定の関数については情報を取得する必要はありません。私は、可能ならば、関数参照を与えられた対応するPCを取得する方法を知っていれば、その質問に答えられると信じています。 – moraes

関連する問題