23

Go のリフレクション システムを使用して関数の名前を取得しようとしていますが、その型で Name メソッドを呼び出すと空の文字列が返されます。これは予想される動作ですか?

これは、私が問題にどのようにアプローチするかの簡単な例です。

package main

import "fmt"
import "reflect"

func main() {
    typ := reflect.TypeOf(main)
    name := typ.Name()
    fmt.Println("Name of function" + name)
}
4

4 に答える 4

34

解決策は、を返すFuncForPcを使用すること*Funcです。

これは以下を返します"main.main":

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"、トークン化してください。

于 2012-05-24T18:04:34.760 に答える
32
package main

import "fmt"
import "runtime"

func main() {
    pc, _, _, _ := runtime.Caller(0)
    fmt.Println("Name of function: " + runtime.FuncForPC(pc).Name())
    fmt.Println()

    // or, define a function for it
    fmt.Println("Name of function: " + funcName())
    x()
}

func funcName() string {
    pc, _, _, _ := runtime.Caller(1)
    return runtime.FuncForPC(pc).Name()
}

func x() {
    fmt.Println("Name of function: " + funcName())
    y()
}

func y() {
    fmt.Println("Name of function: " + funcName())
    z()
}
func z() {
    fmt.Println("Name of function: " + funcName())
}

出力:

関数名: main.main

関数名: main.main関数名
: main.x
関数名: main.y 関数
名: main.z

于 2012-05-24T19:08:33.777 に答える