Go 有一个常见的习语,如下所示:if val, err := func(); err != nil { /* val and err are in scope */...}/* val and err are no longer in scope */使用“短分配”。我当然是粉丝。感觉类似于:/* code not involving val */{ int val; if ((val = func()) == ERR_VALUE) { /* Process the error */ } /* Do something with val */}/* more code not involving val */在 C++ 中。让我感到困惑的是,如果 if 的第一个子句中有多个变量,它们必须具有相同的作用域,即您必须执行以下任一操作:var err errorvar val stringif val, err = func(); err != nil {...或者if val, err := func(); err != nil {...一个非常常见的用例似乎是您想在 if 的第一个子句中设置一个变量,测试是否有错误,如果没有,则继续执行程序流程的其余部分(和能够使用您在执行 if 时分配的任何值)。但是,在我看来,如果你想这样做,你必须:使用临时变量,然后在 else 中分配持久变量值:var valif tempval, err := func(); err != nil { /* Process the error */} else { val = tempval}声明 err 变量的范围超过 if ,如上所述。第一个选项看起来很笨拙——被迫使用“else”子句只是为了确保值不会超出范围——而第二个选项放弃了限制变量范围的优势。对于这种(看似很常见的)情况,更有经验的 Go 程序员会使用哪些习语?
1 回答
胡子哥哥
TA贡献1825条经验 获得超6个赞
“If”语句根据布尔表达式的值指定两个分支的条件执行。如果表达式计算结果为真,则执行“if”分支,否则,如果存在,则执行“else”分支。
IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( IfStmt | Block ) ] .
.
if x > max {
x = max
}
表达式前面可能有一个简单的语句,该语句在表达式计算之前执行。
if x := f(); x < y {
return x
} else if x > z {
return z
} else {
return y
}
如果你不能利用特殊形式,
if val, err := fnc(); err != nil {
// ...
}
然后使用常规形式,
val, err := fnc()
if err != nil {
// ...
}
正则形式是 Go 语言必备的常用形式。为方便起见,特殊形式是正则形式的特化;这不是必需的。如果特殊形式比普通形式更方便使用,就使用它。否则,请使用常规形式。
Go 是一种块结构的编程语言,其起源可以追溯到 Algol 60、C、Pascal、Modula 2 和 Oberon。
因此,你可以写
x := false
{
x := true
if x {
fmt.Println(x)
}
}
fmt.Println(x)
或者,等效地,为了方便,
x := false
if x := true; x {
fmt.Println(x)
}
fmt.Println(x)
两种情况下的输出都是
true
false
- 1 回答
- 0 关注
- 135 浏览
添加回答
举报
0/150
提交
取消