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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何比較 Go 中的 2 個(gè)函數(shù)?

如何比較 Go 中的 2 個(gè)函數(shù)?

Go
ITMISS 2021-12-07 14:48:56
例如,我有要比較的函數(shù)列表:http://play.golang.org/p/_rCys6rynftype Action func(foo string)type Handler struct {  Get Action  Post Action}var routes map[string]Handlerfunc Undefined(foo string) {}func Defined(foo string) {}func init() {  routes = map[string]Handler{    `/`: Handler{Defined,Undefined},  }}func main() {  for _, handler := range routes {    if handler.Post != Undefined {       // do something    } // invalid operation: (func(string))(handler.Post) != Undefined (func can only be compared to nil)    if &handler.Post != &Undefined {       // do something     } // cannot take the address of Undefined    // invalid operation: &handler.Post != &Undefined (mismatched types *Action and *func(string))  }}比較兩個(gè)函數(shù)是否相同的正確方法是什么?
查看完整描述

3 回答

?
精慕HU

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊

在繼續(xù)之前:您應(yīng)該重構(gòu)而不是比較函數(shù)值地址。


規(guī)范:比較運(yùn)算符:


切片、映射和函數(shù)值不可比較。但是,作為特殊情況,切片、映射或函數(shù)值可以與預(yù)先聲明的標(biāo)識(shí)符進(jìn)行比較nil。


函數(shù)值不具有可比性。您可以做的是比較函數(shù)值的地址是否相同(不是保存函數(shù)值的變量的地址,而是函數(shù)值本身)。


您不能獲取 function 的地址,但是如果您將其與fmt包一起打印,則會(huì)打印其地址。所以你可以使用fmt.Sprintf()來獲取一個(gè)函數(shù)值的地址。


請(qǐng)參閱此示例(基于您的代碼):


hand := &Handler{Undefined, Defined}

p1 := fmt.Sprintf("%v", Undefined)

p2 := fmt.Sprintf("%v", hand.Get)

fmt.Println("Expecting true:", p1 == p2)


fmt.Println("Expecting false:", fmt.Sprintf("%v", Defined) == fmt.Sprintf("%v", hand.Get))

fmt.Println("Expecting true:", fmt.Sprintf("%v", Defined) == fmt.Sprintf("%v", hand.Post))

輸出(在Go Playground上試試):


Expecting true: true

Expecting false: false

Expecting true: true

另一種選擇是用于reflect.Value.Pointer()獲取函數(shù)值的地址,這正是fmt包的作用fmt/print.go:


func (p *pp) fmtPointer(value reflect.Value, verb rune) {

    // ...

    case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice,

            reflect.UnsafePointer:

        u = value.Pointer()

    // ...

}

但是您應(yīng)該重構(gòu)而不是比較函數(shù)值地址。


查看完整回答
反對(duì) 回復(fù) 2021-12-07
?
30秒到達(dá)戰(zhàn)場(chǎng)

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

沒關(guān)系,找到答案:

runtime.FuncForPC(reflect.ValueOf(handler.Post).Pointer()).Name() != 
   runtime.FuncForPC(reflect.ValueOf(Undefined).Pointer()).Name()


查看完整回答
反對(duì) 回復(fù) 2021-12-07
?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

你不能比較功能。它需要存儲(chǔ)到一個(gè)變量中,并將其作為指針引用。

http://play.golang.org/p/sflsjjCHN5


查看完整回答
反對(duì) 回復(fù) 2021-12-07
  • 3 回答
  • 0 關(guān)注
  • 462 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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