首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法的返回值与多个返回值的比较

方法的返回值与多个返回值的比较
EN

Stack Overflow用户
提问于 2015-10-19 08:57:23
回答 2查看 830关注 0票数 1

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

代码语言:javascript
复制
func a() (int, int, int) {...}

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

我想知道这些方法的返回值是否相同,如下所示:

代码语言:javascript
复制
equal := a() == b()

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

代码语言:javascript
复制
my_file.go:14: multiple-value a() in single-value context
my_file.go:14: multiple-value b() in single-value context

我目前的工作是创建一个与方法具有相同签名的自定义类型,然后创建第三个函数来执行检查:

代码语言:javascript
复制
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)

但我希望有一个更普遍的解决办法。

EN

回答 2

Stack Overflow用户

发布于 2015-10-19 09:05:20

带结构

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

代码语言:javascript
复制
type Result struct {
    a, b, c int
}

并使用它:

代码语言:javascript
复制
p, q := Result{}, Result{}
p.a, p.b, p.c = a()
q.a, q.b, q.c = b()
fmt.Println(p == q)

用数组

或者您也可以使用数组(数组也可以与片不同),尽管这不会更短,但是您不需要使用新的类型:

代码语言:javascript
复制
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包构造通用解决方案。这基本上是调用两个函数,并比较所有的结果值。省略错误检查!

代码语言:javascript
复制
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
}

并使用它:

代码语言:javascript
复制
fmt.Println(check(reflect.ValueOf(a), reflect.ValueOf(b)))

围棋游乐场上试试这些。

票数 1
EN

Stack Overflow用户

发布于 2015-10-19 09:02:42

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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33210377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档