考虑以下示例方法,每个方法返回三个整数:
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)但我希望有一个更普遍的解决办法。
发布于 2015-10-19 09:05:20
带结构
您可以通过将结果存储在具有可比性的结构的值中来稍微改进它:
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)))在围棋游乐场上试试这些。
发布于 2015-10-19 09:02:42
这可能不是您想要的,但是如果您不返回三个未命名的ints,而是返回结构,您可以直接比较它们。例如。
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。
https://stackoverflow.com/questions/33210377
复制相似问题