如何比较函数类型的相等性?

时间:2017-07-16 23:23:13

标签: go

我正在做一些测试并尝试测试某些函数类型的相等性。我有https://play.golang.org/p/GeE_YJF5lz

package main

import (
    "fmt"
    "reflect"
)

type myStruct struct {
    f []someFunc
}

type someFunc func(a string) bool

var sf1 someFunc = func(a string) bool {
    return true
}

var sf2 someFunc = func(a string) bool {
    return false
}

func main() {
    a := []someFunc{sf1, sf2}
    b := []someFunc{sf1, sf2}

    fmt.Println(reflect.DeepEqual(a, b)) // false

    m := &myStruct{
        f: []someFunc{sf1, sf2},
    }

    n := &myStruct{
        f: []someFunc{sf1, sf2},
    }

    fmt.Println(reflect.DeepEqual(m, n)) // false
}

我没有能够在文档中找到关于比较函数的任何内容,并且知道我必须遗漏一些重要的内容,以便为什么反映.DeepEqual并不适合它们。

1 个答案:

答案 0 :(得分:0)

你可以比较这样的函数,在这里阅读更多关于函数表示的信息:http://golang.org/s/go11func

public String replace(char oldChar, char newChar) 

例如:这只是您的起点。

func funcEqual(a, b interface{}) bool {
    av := reflect.ValueOf(&a).Elem()
    bv := reflect.ValueOf(&b).Elem()
    return av.InterfaceData() == bv.InterfaceData()
}

输出:

func main() {
    a := []someFunc{sf1, sf2}
    b := []someFunc{sf1, sf2}

    for idx, f := range a {
        fmt.Println("Index: ", idx, funcEqual(f, b[idx]))
    }
}

播放链接:https://play.golang.org/p/6cSVXSYfa5