猿问

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

考虑以下示例方法,每个方法都返回三个整数:


func a() (int, int, int) {...}


func b() (int, int, int) {...}

我想知道这些方法的返回值是否相同,像这样:


equal := a() == b()

但是,这不会编译,因为编译器需要一个值:


my_file.go:14: multiple-value a() in single-value context

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

但我想有一个更通用的解决方案。


BIG阳
浏览 164回答 2
2回答

绝地无双

带结构您可以通过将结果存储在可比较的结构值中来稍微改进它: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上试试这些。

慕莱坞森

这可能不是您想要的,但是如果您返回结构体而不是返回三个未命名的整数,则可以直接比较它们。例如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。
随时随地看视频慕课网APP

相关分类

Go
我要回答