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 error
var val string
if val, err = func(); err != nil {
...
或者
if val, err := func(); err != nil {
...
一个非常常见的用例似乎是您想在 if 的第一个子句中设置一个变量,测试是否有错误,如果没有,则继续执行程序流程的其余部分(和能够使用您在执行 if 时分配的任何值)。但是,在我看来,如果你想这样做,你必须:
使用临时变量,然后在 else 中分配持久变量值:
var val
if tempval, err := func(); err != nil {
/* Process the error */
} else {
val = tempval
}
声明 err 变量的范围超过 if ,如上所述。
第一个选项看起来很笨拙——被迫使用“else”子句只是为了确保值不会超出范围——而第二个选项放弃了限制变量范围的优势。对于这种(看似很常见的)情况,更有经验的 Go 程序员会使用哪些习语?
胡子哥哥
相关分类