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上试试这些。
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。
- 2 回答
- 0 关注
- 163 浏览
添加回答
举报