为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在 Go 中获取函数名称时有“-fm”后缀?

为什么在 Go 中获取函数名称时有“-fm”后缀?

Go
拉风的咖菲猫 2021-11-08 19:31:57
对于下面的代码片段(可通过 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.


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 417 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信