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

TA貢獻1797條經驗 獲得超6個贊
這稱為短路評估。根據本教程,布爾運算符使用這個:
盡管在Go 語言規范中沒有明確說明 Go 使用短路評估,但確實提到了
邏輯運算符應用于布爾值并產生與操作數相同類型的結果。有條件地評估右操作數。
這是一個簡單的例子來證明 Go 使用短路評估
[…]

TA貢獻1993條經驗 獲得超6個贊
您所指的是所謂的“短路求值”——也就是說,僅在完整結果可用時才使用正常的關聯性規則對子表達式求值,并且對其余表達式的求值不會根據有問題的二元運算符的規則。
Go 確實實現了邏輯表達式的短路評估。
“惰性求值”完全是另一回事——通常在所謂的“函數式”編程語言中實現,并沒有直接在 Go 中實現。
話雖如此,我會注意到雖然 Go 沒有直接(與語法和運行時一樣)支持惰性求值,但可以在需要時使用它。
例如,您可能有一個 goroutine 從通道讀取可能無限數量的項目,并以一種或另一種方式處理它們,而另一個 goroutine(或其中的幾個)產生這些值并通過通道發送它們。這樣,這些值只會在接收端“具體化”,不會比它們實際準備好處理的速度更快。
- 3 回答
- 0 關注
- 214 瀏覽
添加回答
舉報