3 回答

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
Go 確實(shí)實(shí)現(xiàn)了正常的短路評(píng)估,可以用以下代碼推導(dǎo)出:
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
}
...這將永遠(yuǎn)給:
$ 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貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
這稱為短路評(píng)估。根據(jù)本教程,布爾運(yùn)算符使用這個(gè):
盡管在Go 語(yǔ)言規(guī)范中沒(méi)有明確說(shuō)明 Go 使用短路評(píng)估,但確實(shí)提到了
邏輯運(yùn)算符應(yīng)用于布爾值并產(chǎn)生與操作數(shù)相同類型的結(jié)果。有條件地評(píng)估右操作數(shù)。
這是一個(gè)簡(jiǎn)單的例子來(lái)證明 Go 使用短路評(píng)估
[…]

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