3 回答
TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
類似于goroutine 的執(zhí)行順序
如果多次運(yùn)行,可能會(huì)得到不同的結(jié)果。當(dāng)我運(yùn)行這個(gè)時(shí),我得到:
Sending 103 to chan
Sending 1 to chan
103 1 104
如果你希望結(jié)果是確定性的。您可以使用兩個(gè)渠道:
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貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
goroutine 的執(zhí)行順序沒(méi)有保證。當(dāng)您啟動(dòng)多個(gè) goroutine 時(shí),它們可能會(huì)也可能不會(huì)按照您期望的順序執(zhí)行,除非它們之間存在顯式同步,例如通道或其他同步原語(yǔ)。
在你的例子中,第二個(gè) goroutine 在第一個(gè) goroutine 之前寫入通道,因?yàn)闆](méi)有機(jī)制來(lái)強(qiáng)制兩個(gè) goroutine 之間的排序。
TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
golang規(guī)范關(guān)于通道的說(shuō)明:
通道充當(dāng)先進(jìn)先出隊(duì)列。例如,如果一個(gè) Goroutine 在通道上發(fā)送值,而第二個(gè) Goroutine 接收它們,則這些值將按照發(fā)送的順序接收。
如果將上述語(yǔ)句與 goroutine 執(zhí)行的任意順序結(jié)合起來(lái),可能會(huì)導(dǎo)致將項(xiàng)目排隊(duì)到通道中的任意順序。
- 3 回答
- 0 關(guān)注
- 189 瀏覽
添加回答
舉報(bào)
