gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:15:35 26 4
gpt4 key购买 nike

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

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)

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

最佳答案

使用结构

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

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)

用数组

或者你可以使用数组(数组也可以与 slice 不同),虽然这不会更短,但是你不需要一个新的类型:

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 上试试这些.

关于go - 比较具有多个返回值的方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33210377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com