对于下面的代码片段(可通过 Go Playground 运行),package mainimport ( "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在函数名的末尾有一个?
1 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
结果u.DummyHandler
是一个方法值,编译器通过创建函数闭包和修改函数名称来实现方法。在这里引用伊恩:
顺便说一下,这似乎已经变成了 -fm 提示。
您的代码正在获取方法值。p.beHappy 是绑定到 p 特定值的 beHappy 方法。这是通过创建一个函数闭包来实现的,并且该闭包的代码需要一个名称。编译器碰巧通过在末尾添加 fm 来命名该名称,但它可以是任何不会与任何其他函数名称冲突的名称。在 Go 中没有任何方法可以命名该函数,因此该名称与除调试器或 FuncForPC 之外的任何其他内容无关。
获取方法名称的更好方法似乎是直接引用该方法,如下所示:
func main() { funcName((User).DummyHandler)}
这将输出main.User.DummyHandler
.
- 1 回答
- 0 关注
- 417 浏览
添加回答
举报
0/150
提交
取消