为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
江户川乱折腾 2021-12-07 18:39:22
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个赞

Go 编程语言规范

如果语句

“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


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信