对于下面的代码段(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

10-07 20:12