ホームページ >バックエンド開発 >Golang >Go コードで現在の関数名を取得するにはどうすればよいですか?

Go コードで現在の関数名を取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-15 08:45:14737ブラウズ

How Can I Get the Current Function Name in Go Code?

Go コードのイントロスペクト: 現在の関数名の取得

Go では、現在の関数名の取得はデバッグとトレースにとって重要です。 gcc の FUNCTION マクロはこの機能を提供しており、Go でそれをエミュレートすることを目指しています。

解決策

鍵はランタイム パッケージにあります。解決策は次のとおりです:

import (
    "fmt"
    "runtime"
)

func trace() {
    pc := make([]uintptr, 10) // Need at least 1 entry
    runtime.Callers(2, pc)
    f := runtime.FuncForPC(pc[0])
    file, line := f.FileLine(pc[0])
    fmt.Printf("%s:%d %s\n", file, line, f.Name())
}

この関数は次のように動作します:

  1. プログラム カウンター (PC) の取得: runtime.Callers を使用して PC を取得します。現在の関数と呼び出しスタックのフレーム。トレース関数自体をスキップするには、深さ 2 を指定します。
  2. 関数の詳細の取得: runtime.FuncForPC を使用して、PC に対応する Func オブジェクトを取得します。このオブジェクトは、関数名、行番号、およびファイル名へのアクセスを提供します。
  3. 関数情報の出力: 最後に、関数のファイル名、行番号、および名前を出力します。

更新された例

Go バージョン 1.7 の場合、推奨されるアプローチは、runtime.FuncForPC の代わりに runtime.CallersFrames を使用することです。以下の更新された例:

import (
    "fmt"
    "runtime"
)

func trace() {
    pc := make([]uintptr, 10) // Need at least 1 entry
    runtime.CallersFrames(2, pc)
    frame, _ := runtime.CallersFrames(2, pc)
    fmt.Printf("%s:%d %s\n", frame[0].File, frame[0].Line, frame[0].Function)
}

以上がGo コードで現在の関数名を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。