避免与go中返回2个值的函数一起嵌套?

时间:2016-02-22 07:33:33

标签: go nested return-value

这里,我有一个连接表达式,涉及一些返回2个值的函数:

if _, ok := f(); ok {
  if _, ok := g(); !ok {
    if h() {
      if _, ok := i(); ok {
        doStuff()
      }
    }
  }
}

我可以以某种方式避免嵌套吗?我可以将其作为一个表达式写在一行中而不是嵌套(在这种情况下我不能完全破解或返回)吗?

2 个答案:

答案 0 :(得分:2)

使用辅助功能,你可以。

创建一个辅助函数,它返回第二个bool返回值,例如:

func check(dummy interface{}, ok bool) bool {
    return ok
}

使用它:

if check(f()) && check(g()) && h() && check(i()) {
    doStuff()
}

请注意,这相当于原始代码,因为&&运算符是从左到右进行计算的,并且正在使用short-circuit evaluation:如果任何操作数计算为false,则进一步操作数(函数)将不会被调用。

check()函数适用于返回2个值且第2个类型为bool的所有函数(因为任何值都可以分配给interface{}类型的变量)。

Spec: Calls

中介绍了这一点
  

作为一种特殊情况,如果函数或方法g的返回值在数量上相等并且可以单独分配给另一个函数或方法f的参数,则调用{{1}将f(g(parameters_of_g))的返回值按顺序绑定到f的参数后,将调用gf的调用必须不包含f调用之外的任何参数,g必须至少有一个返回值。如果g具有最终f参数,则会为其分配返回值...,这些值将在分配常规参数后保留。

注意:由于g中的第一个参数未被使用,我们甚至可以在命名时使用空白标识符,这样很明显我们不会使用该参数:

check()

答案 1 :(得分:1)

避免使用函数从页面右侧运行深度嵌套或长条件。例如,

package main

func f() (int, bool) { return 1, true }

func g() (int, bool) { return 1, true }

func h() bool { return true }

func i() (int, bool) { return 1, true }

func doStuff(f, g, i int) int { return f + g + i }

func andDoStuff() {
    ff, ok := f()
    if !ok {
        return
    }
    gg, ok := g()
    if !ok {
        return
    }
    if ok := h(); !ok {
        return
    }
    ii, ok := i()
    if !ok {
        return
    }
    doStuff(ff, gg, ii)

}

func main() {
    andDoStuff()
}