对于下面的代码段(runnable via the Go Playground),
package main
import (
"fmt"
"net/http"
"reflect"
"runtime"
)
type User struct{}
var u = &User{}
func (_ User) DummyHandler(w http.ResponseWriter, r *http.Request) {}
func funcName(i interface{}) {
p := reflect.ValueOf(i).Pointer()
n := runtime.FuncForPC(p).Name()
fmt.Println(n)
}
func main() {
funcName(u.DummyHandler)
}
输出为
main.(User).DummyHandler-fm
。为什么在函数名称的末尾有一个
-fm
? 最佳答案
原来u.DummyHandler
是一个方法值,并且编译器通过创建函数闭包并修改函数名称来实现方法。引用Ian here:
获得方法名称的更好方法似乎是直接引用该方法,如下所示:
func main() {
funcName((User).DummyHandler)
}
这将输出
main.User.DummyHandler
。