这里,我有一个连接表达式,涉及一些返回2个值的函数:
if _, ok := f(); ok {
if _, ok := g(); !ok {
if h() {
if _, ok := i(); ok {
doStuff()
}
}
}
}
我可以以某种方式避免嵌套吗?我可以将其作为一个表达式写在一行中而不是嵌套(在这种情况下我不能完全破解或返回)吗?
答案 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{}
类型的变量)。
作为一种特殊情况,如果函数或方法
g
的返回值在数量上相等并且可以单独分配给另一个函数或方法f
的参数,则调用{{1}将f(g(parameters_of_g))
的返回值按顺序绑定到f
的参数后,将调用g
。f
的调用必须不包含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()
}