第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用渠道下單

使用渠道下單

Go
湖上湖 2023-07-31 15:25:02
我從 Go 旅游中有這個代碼:func sum(s []int, c chan int) {    sum := 0    for _, v := range s {        sum += v    }    fmt.Printf("Sending %d to chan\n", sum)    c <- sum // send sum to c}func main() {    s := []int{2, 8, -9, 4, 0, 99}    c := make(chan int)    go sum(s[len(s)/2:], c)    go sum(s[:len(s)/2], c)    x, y := <-c, <-c // receive from c    fmt.Println(x, y, x+y)}產(chǎn)生以下輸出:Sending 1 to chanSending 103 to chan1 103 104在此,x 獲得第二個總和,y 獲得第一個總和。為什么順序顛倒了?
查看完整描述

3 回答

?
慕桂英4014372

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)

}


查看完整回答
反對 回復(fù) 2023-07-31
?
千巷貓影

TA貢獻1829條經(jīng)驗 獲得超7個贊

goroutine 的執(zhí)行順序沒有保證。當您啟動多個 goroutine 時,它們可能會也可能不會按照您期望的順序執(zhí)行,除非它們之間存在顯式同步,例如通道或其他同步原語。

在你的例子中,第二個 goroutine 在第一個 goroutine 之前寫入通道,因為沒有機制來強制兩個 goroutine 之間的排序。


查看完整回答
反對 回復(fù) 2023-07-31
?
楊__羊羊

TA貢獻1943條經(jīng)驗 獲得超7個贊

golang規(guī)范關(guān)于通道的說明:

通道充當先進先出隊列。例如,如果一個 Goroutine 在通道上發(fā)送值,而第二個 Goroutine 接收它們,則這些值將按照發(fā)送的順序接收。

如果將上述語句與 goroutine 執(zhí)行的任意順序結(jié)合起來,可能會導(dǎo)致將項目排隊到通道中的任意順序。

查看完整回答
反對 回復(fù) 2023-07-31
  • 3 回答
  • 0 關(guān)注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號