如何将两个 return 参数组合成一个值

How to combine two return params into one value

我在我的代码中多次使用不同版本的

func f() (bool, bool) {
   value, successFulOperation := someStuff()
   return value, successFulOperation
}

// somewhere else
value, successfulOperation := f()
if value && successfulOperation {
  // do stuff
}

// do stuff 仅当 value 为真且检索 value 的操作成功且无错误时才应执行。换句话说:我不关心 valuesuccessfulOperation。我只关心value && successfulOperation.

我想避免的解决方案(看起来很冗长):

value, successfulOperation := f()
actualValue := value && successfulOperation
if actualValue {...} 

上面的代码真的很简单。实际上 if 条件会嵌套并且更复杂。

我想要的:

f 的包装,将两个值合二为一。我怎么做?该解决方案适用于采用任何参数并返回两个布尔值的任何函数。

以下无效:

type doubleBoolFunc func(...interface{}) (bool, bool)

func and(fn doubleBoolFunc, params ...interface{}) bool {
    b1, b2 := fn(params...)
    return b1 && b2
}

actualValue := and(f())
func and(a, b bool) bool {
  return a && b
}

那么如果 f return 2 bool

value := and(f())

会起作用

在 go 1.181 语言中出现泛型之前,您无法编写包装函数将两个布尔值合二为一。或者至少你可以,使用反射,但它是一团糟。

但是你可以用 go 1.17 写这个:

func both(x, y bool) bool {
    return x && y
}

func f() (bool, bool) {
    return true, false
}

func main() {
    r := both(f())
    fmt.Println(r)
}

但更实际的(在我看来)是避免这种复杂化,并使用 1 行 if。并不是所有的东西都需要是一个函数或抽象出来:

if a, b := f(); a && b {
    ...
}

[1] 即使在 go 1.18 中引入了泛型,我也不认为会有一种方法来指定表示具有任意参数的函数的泛型类型returns 两个布尔值。

要修复问题末尾的代码,请不要调用函数 f(),只需引用函数名称 f,然后列出其参数:

// actualValue := and(f(args...))
actualValue := and(f, args...)

https://go.dev/play/p/KAT2L58ZQy3