3 回答
TA贡献1845条经验 获得超8个赞
在继续之前:您应该重构而不是比较函数值地址。
规范:比较运算符:
切片、映射和函数值不可比较。但是,作为特殊情况,切片、映射或函数值可以与预先声明的标识符进行比较nil。
函数值不具有可比性。您可以做的是比较函数值的地址是否相同(不是保存函数值的变量的地址,而是函数值本身)。
您不能获取 function 的地址,但是如果您将其与fmt包一起打印,则会打印其地址。所以你可以使用fmt.Sprintf()来获取一个函数值的地址。
请参阅此示例(基于您的代码):
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()获取函数值的地址,这正是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()
// ...
}
但是您应该重构而不是比较函数值地址。
TA贡献1828条经验 获得超6个赞
没关系,找到答案:
runtime.FuncForPC(reflect.ValueOf(handler.Post).Pointer()).Name() != runtime.FuncForPC(reflect.ValueOf(Undefined).Pointer()).Name()
- 3 回答
- 0 关注
- 372 浏览
添加回答
举报