Go のリフレクションを理解する: 関数名の取得
Go のリフレクション システムでは、関数名の取得はそれほど簡単ではありません。思われる。特定のシナリオで予期される動作は、Name メソッドの呼び出し時に空の文字列を取得することです。
予期しない空の文字列:
次のコード スニペットを使用すると、Nameメソッドは空の文字列を返します:
package main import "fmt" import "reflect" func main() { typ := reflect.TypeOf(main) name := typ.Name() fmt.Println("Name of function: " + name) }
この例では、リフレクションを使用して main 関数の名前を取得しようとします。ただし、出力には「関数の名前:」と表示され、空の名前が示されます。
runtime.FuncForPC を使用した解決策:
この問題を解決する鍵は、 runtime.FuncForPC 関数。この関数は、関数の名前を含む関数に関する追加情報を提供する Func 型へのポインターを返します。
package main import "fmt" import "reflect" import "runtime" func main() { name := runtime.FuncForPC(reflect.ValueOf(main).Pointer()).Name() fmt.Println("Name of function: " + name) }
今度は、結果は "main.main" となり、関数の名前を正確に反映します。関数。パッケージ名を含まずに関数名のみを抽出したい場合は、strings.SplitN 関数を使用して文字列を分割できます。
以上がGo Reflection を使用して関数の名前を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。