猿问

在 Go if 语句中混合 := 和 =

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 程序员会使用哪些习语?


江户川乱折腾
浏览 136回答 1
1回答

胡子哥哥

Go 编程语言规范如果语句“If”语句根据布尔表达式的值指定两个分支的条件执行。如果表达式计算结果为真,则执行“if”分支,否则,如果存在,则执行“else”分支。IfStmt&nbsp;=&nbsp;"if"&nbsp;[&nbsp;SimpleStmt&nbsp;";"&nbsp;]&nbsp;Expression&nbsp;Block&nbsp;[&nbsp;"else"&nbsp;(&nbsp;IfStmt&nbsp;|&nbsp;Block&nbsp;)&nbsp;]&nbsp;..if x > max {&nbsp; x = max}表达式前面可能有一个简单的语句,该语句在表达式计算之前执行。if x := f(); x < y {&nbsp; return x} else if x > z {&nbsp; return z} else {&nbsp; return y}如果你不能利用特殊形式,if val, err := fnc(); err != nil {&nbsp; &nbsp; // ...}然后使用常规形式,val, err := fnc()if err != nil {&nbsp; &nbsp; // ...&nbsp;}正则形式是 Go 语言必备的常用形式。为方便起见,特殊形式是正则形式的特化;这不是必需的。如果特殊形式比普通形式更方便使用,就使用它。否则,请使用常规形式。Go 是一种块结构的编程语言,其起源可以追溯到 Algol 60、C、Pascal、Modula 2 和 Oberon。因此,你可以写x := false{&nbsp; &nbsp; x := true&nbsp; &nbsp; if x {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(x)&nbsp; &nbsp; }}fmt.Println(x)或者,等效地,为了方便,x := falseif x := true; x {&nbsp; &nbsp; fmt.Println(x)}fmt.Println(x)两种情况下的输出都是truefalse
随时随地看视频慕课网APP

相关分类

Go
我要回答