登录
首页 >  Golang >  Go问答

如何比较 Go 中的两个函数?

来源:Golang技术栈

时间:2023-04-11 07:32:53 148浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《如何比较 Go 中的两个函数?》,就很适合你!文章讲解的知识点主要包括golang,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

例如,我有要比较的函数列表:

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

type Action func(foo string)

type Handler struct {
  Get Action
  Post Action
}

var routes map[string]Handler

func 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))
  }
}

如果两个功能相同,比较的正确方法是什么?

正确答案

在进一步之前:您应该重构而不是比较函数值地址。

规范:比较运算符:

切片、映射和函数值不可比较。但是,作为一种特殊情况,切片、映射或函数值可以与预先声明的标识符进行比较nil

函数值不可比较。您可以做的是比较函数值的地址是否相同(不是保存函数值的变量的地址,而是函数值本身)。

您不能获取函数的地址,但如果您使用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()
    // ...
}

但是您应该重构而不是比较函数值地址。

今天关于《如何比较 Go 中的两个函数?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>