第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在 Go 中獲取函數(shù)名稱時有“-fm”后綴?

為什么在 Go 中獲取函數(shù)名稱時有“-fm”后綴?

Go
拉風(fēng)的咖菲貓 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在函數(shù)名的末尾有一個?
查看完整描述

1 回答

?
搖曳的薔薇

TA貢獻1793條經(jīng)驗 獲得超6個贊

結(jié)果u.DummyHandler是一個方法值,編譯器通過創(chuàng)建函數(shù)閉包和修改函數(shù)名稱來實現(xiàn)方法。在這里引用伊恩:

順便說一下,這似乎已經(jīng)變成了 -fm 提示。

您的代碼正在獲取方法值。p.beHappy 是綁定到 p 特定值的 beHappy 方法。這是通過創(chuàng)建一個函數(shù)閉包來實現(xiàn)的,并且該閉包的代碼需要一個名稱。編譯器碰巧通過在末尾添加 fm 來命名該名稱,但它可以是任何不會與任何其他函數(shù)名稱沖突的名稱。在 Go 中沒有任何方法可以命名該函數(shù),因此該名稱與除調(diào)試器或 FuncForPC 之外的任何其他內(nèi)容無關(guān)。

獲取方法名稱的更好方法似乎是直接引用該方法,如下所示:

func main() {
  funcName((User).DummyHandler)}

這將輸出main.User.DummyHandler.


查看完整回答
反對 回復(fù) 2021-11-08
  • 1 回答
  • 0 關(guān)注
  • 465 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號