猿问

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

对于下面的代码片段(可通过 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在函数名的末尾有一个?


拉风的咖菲猫
浏览 418回答 1
1回答

摇曳的蔷薇

结果u.DummyHandler是一个方法值,编译器通过创建函数闭包和修改函数名称来实现方法。在这里引用伊恩:顺便说一下,这似乎已经变成了 -fm 提示。您的代码正在获取方法值。p.beHappy 是绑定到 p 特定值的 beHappy 方法。这是通过创建一个函数闭包来实现的,并且该闭包的代码需要一个名称。编译器碰巧通过在末尾添加 fm 来命名该名称,但它可以是任何不会与任何其他函数名称冲突的名称。在 Go 中没有任何方法可以命名该函数,因此该名称与除调试器或 FuncForPC 之外的任何其他内容无关。获取方法名称的更好方法似乎是直接引用该方法,如下所示:func main() {   funcName((User).DummyHandler)}这将输出main.User.DummyHandler.
随时随地看视频慕课网APP

相关分类

Go
我要回答