3 回答

TA貢獻1871條經(jīng)驗 獲得超13個贊
類似于goroutine 的執(zhí)行順序
如果多次運行,可能會得到不同的結(jié)果。當我運行這個時,我得到:
Sending 103 to chan
Sending 1 to chan
103 1 104
如果你希望結(jié)果是確定性的。您可以使用兩個渠道:
func main() {
? ? s := []int{2, 8, -9, 4, 0, 99}
? ? c1 := make(chan int)
? ? c2 := make(chan int)
? ? go sum(s[len(s)/2:], c1)
? ? go sum(s[:len(s)/2], c2)
? ? x, y := <-c1, <-c2 // receive from c
? ? fmt.Println(x, y, x+y)
}

TA貢獻1829條經(jīng)驗 獲得超7個贊
goroutine 的執(zhí)行順序沒有保證。當您啟動多個 goroutine 時,它們可能會也可能不會按照您期望的順序執(zhí)行,除非它們之間存在顯式同步,例如通道或其他同步原語。
在你的例子中,第二個 goroutine 在第一個 goroutine 之前寫入通道,因為沒有機制來強制兩個 goroutine 之間的排序。

TA貢獻1943條經(jīng)驗 獲得超7個贊
golang規(guī)范關(guān)于通道的說明:
通道充當先進先出隊列。例如,如果一個 Goroutine 在通道上發(fā)送值,而第二個 Goroutine 接收它們,則這些值將按照發(fā)送的順序接收。
如果將上述語句與 goroutine 執(zhí)行的任意順序結(jié)合起來,可能會導(dǎo)致將項目排隊到通道中的任意順序。
- 3 回答
- 0 關(guān)注
- 152 瀏覽
添加回答
舉報