为了账号安全,请及时绑定邮箱和手机立即绑定

比较具有多个返回值的方法的返回值

比较具有多个返回值的方法的返回值

Go
BIG阳 2021-11-15 17:16:32
考虑以下示例方法,每个方法都返回三个整数:func a() (int, int, int) {...}func b() (int, int, int) {...}我想知道这些方法的返回值是否相同,像这样:equal := a() == b()但是,这不会编译,因为编译器需要一个值:my_file.go:14: multiple-value a() in single-value contextmy_file.go:14: multiple-value b() in single-value context我目前的工作是创建一个与方法具有相同签名的自定义类型,然后创建第三个函数来进行检查:type multiReturnFunc func() (int, int, int)func a() (int, int, int) {...}func b() (int, int, int) {...}func checkMultiReturns(a, b multiReturnFunc) bool {    a1, a2, a3 := a()    b1, b2, b3 := b()    return a1 == b1 && a2 == b2 && a3 == b3}...equal := checkMultiReturns(a, b)但我想有一个更通用的解决方案。
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

带结构

您可以通过将结果存储在可比较的结构值中来稍微改进它:


type Result struct {

    a, b, c int

}

并使用它:


p, q := Result{}, Result{}

p.a, p.b, p.c = a()

q.a, q.b, q.c = b()

fmt.Println(p == q)

带数组

或者您可以使用数组(与切片不同,数组也具有可比性),尽管这不会更短,但您不需要为此使用新类型:


x, y := [3]int{}, [3]int{}

x[0], x[1], x[2] = a()

y[0], y[1], y[2] = b()

fmt.Println(x == y)

一般解决方案(使用reflect)

可以使用该reflect包构建通用解决方案。这基本上调用了两个函数,并比较所有结果值。省略了错误检查!


func check(v1, v2 reflect.Value) bool {

    r1 := v1.Call(nil)

    r2 := v2.Call(nil)

    if len(r1) != len(r2) {

        return false

    }


    for i, a := range r1 {

        if a.Interface() != r2[i].Interface() {

            return false

        }

    }


    return true

}

并使用它:


fmt.Println(check(reflect.ValueOf(a), reflect.ValueOf(b)))

Go Playground上试试这些。


查看完整回答
反对 回复 2021-11-15
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

这可能不是您想要的,但是如果您返回结构体而不是返回三个未命名的整数,则可以直接比较它们。例如


type XYZ struct{ X, Y, Z int }


func f() XYZ { return XYZ{1, 2, 3} }

func g() XYZ { return XYZ{1, 2, 3} }


func main() {

    fmt.Println(f() == g())

    // Output:

    //   true

}

游乐场:http : //play.golang.org/p/zFXPqPjTtZ。


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信