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

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

Go中的短路評估

Go中的短路評估

Go
30秒到達戰場 2023-05-15 15:09:31
我對短路評估的理解是,僅在 if 語句中需要時才調用表達式。Go 遵循這個嗎?例如,我會從以下方面獲得更好的平均表現:if !isValidQueryParams(&queries) || r == nil || len(queries) == 0 {    return "", fmt.Errorf("invalid querystring")}...對此:if r == nil || len(queries) == 0 || !isValidQueryParams(&queries) {    return "", fmt.Errorf("invalid querystring")}...因為是一個開銷比測試地圖長度isValidQueryParams多得多的函數嗎?r == nil即解釋器是否會首先評估 r == nil,看到它是真的而不費心去評估其他條件?編輯:錯誤地將短路評估稱為惰性評估
查看完整描述

3 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊


Go 確實實現了正常的短路評估,可以用以下代碼推導出:


package main


import "fmt"


func main() {

? ? for i := 0; i < 10; i++ {

? ? ? ? if testFunc(1) || testFunc(2) {

? ? ? ? ? ? // do nothing

? ? ? ? }

? ? }

}


func testFunc(i int) bool {

? ? fmt.Printf("function %d called\n", i)

? ? return true

}

...這將永遠給:


$ function 1 called

$ function 1 called

$ function 1 called

$ function 1 called

$ function 1 called

$ function 1 called

$ function 1 called

$ function 1 called

$ function 1 called

$ function 1 called


查看完整回答
反對 回復 2023-05-15
?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

這稱為短路評估。根據本教程,布爾運算符使用這個:

盡管在Go 語言規范中沒有明確說明 Go 使用短路評估,但確實提到了

邏輯運算符應用于布爾值并產生與操作數相同類型的結果。有條件地評估右操作數。

這是一個簡單的例子來證明 Go 使用短路評估

[…]


查看完整回答
反對 回復 2023-05-15
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

您所指的是所謂的“短路求值”——也就是說,僅在完整結果可用時才使用正常的關聯性規則對子表達式求值,并且對其余表達式的求值不會根據有問題的二元運算符的規則。

Go 確實實現了邏輯表達式的短路評估。

“惰性求值”完全是另一回事——通常在所謂的“函數式”編程語言中實現,并沒有直接在 Go 中實現。


話雖如此,我會注意到雖然 Go 沒有直接(與語法和運行時一樣)支持惰性求值,但可以在需要時使用它。

例如,您可能有一個 goroutine 從通道讀取可能無限數量的項目,并以一種或另一種方式處理它們,而另一個 goroutine(或其中的幾個)產生這些值并通過通道發送它們。這樣,這些值只會在接收端“具體化”,不會比它們實際準備好處理的速度更快。


查看完整回答
反對 回復 2023-05-15
  • 3 回答
  • 0 關注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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