3 回答

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ù)值地址。

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()

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
- 3 回答
- 0 關(guān)注
- 462 瀏覽
添加回答
舉報(bào)