亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號