Go 言語のコードを作成するとき、ロギングまたはデバッグのために現在の関数またはメソッドの名前を取得する必要がある場合があります。この記事ではGo言語でメソッド名を取得する方法を紹介します。
Go 言語は、実行時に型情報を取得できるリフレクション メカニズムを提供します。リフレクション メカニズムを使用すると、現在の関数またはメソッドの型情報を取得し、メソッド名を取得できます。以下は簡単なプログラム例です:
package main import ( "fmt" "reflect" "runtime" ) func main() { foo := Foo{} foo.Bar() } type Foo struct{} func (f Foo) Bar() { fmt.Println(getFunctionName()) } func getFunctionName() string { pc, _, _, _ := runtime.Caller(1) fn := runtime.FuncForPC(pc) return reflect.ValueOf(fn.Name()).String() }
上記のプログラムを実行すると、出力結果は次のようになります:
main.(Foo).Bar
ご覧のとおり、getFunctionName() 関数は関数またはメソッドの名前を返します。現在それを呼んでいます。ここでは、 runtime.Caller() 関数と runtime.FuncForPC() 関数を使用して、それぞれ現在の関数またはメソッドの呼び出し元の PC 値と関数オブジェクトを取得し、リフレクション メカニズムを使用して関数オブジェクトの名前を取得します。 。
取得される関数名には、関数名そのものだけでなく、それが属する型の名前も含まれることに注意してください。そのため、取得した関数名をプログラム内で加工してメソッド名や関数名を抽出する必要があります。
以下は、関数名から関数またはメソッドの名前を抽出する方法を示す、より複雑なサンプル プログラムです。
package main import ( "fmt" "reflect" "runtime" "strings" ) func main() { foo := Foo{} foo.Bar() } type Foo struct{} func (f Foo) Bar() { fmt.Println(getMethodName()) } func getMethodName() string { pc, _, _, _ := runtime.Caller(1) fn := runtime.FuncForPC(pc) fullName := fmt.Sprintf("%s", fn.Name()) lastDotIndex := strings.LastIndex(fullName, ".") return fullName[lastDotIndex+1:] }
上記のプログラムを実行すると、出力結果は次のようになります。
Bar
ご覧のとおり、getMethodName() 関数は現在呼び出しているメソッドの名前を返します。ここでは、strings.LastIndex() 関数を使用して関数名の最後の「.」文字の位置を取得し、その位置の後ろから文字列をインターセプトしてメソッド名を取得します。
上記のプログラム例の getMethodName() 関数は、メソッド名の取得にのみ適していることに注意してください。関数名を取得する必要がある場合は、別の処理ロジックを記述する必要があります。
つまり、Go 言語自体は、関数やメソッドの情報を簡単に取得できるいくつかのリフレクション メカニズムを提供します。リフレクション メカニズムを通じて、実行時に型情報を取得し、関数やメソッドの名前、パラメーター、その他の情報を取得できるため、プログラムの開発、デバッグ、最適化に非常に役立ちます。
以上がgolangでメソッド名を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。