亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

golang 頻道是基于 LIFO 的嗎?

golang 頻道是基于 LIFO 的嗎?

Go
犯罪嫌疑人X 2023-03-21 14:24:36
我想知道 golang 頻道中元素的順序。運行幾個例子后,似乎元素從通道中出來的順序是“后進先出”。我對嗎?以下代碼段是我使用的示例。運行代碼后,輸出為 20 10,而 10 首先發送到通道,最后發送 20。package mainimport "fmt"func multiply(c chan int, num int) {    c <- num * 10}func main() {    c := make(chan int)    go multiply(c, 1)    go multiply(c, 2)    v1 := <-c    v2 := <-c    fmt.Println(v1, v2)}
查看完整描述

1 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

Golang 通道不是 LIFO。

通道充當先進先出隊列。例如,如果一個 goroutine 在通道上發送值,而第二個 goroutine 接收它們,則值按發送順序接收。

只要通道的接收者準備就緒,通道上發送的值就會被接收。如果沒有,它就會阻塞。為了管理它,您可以使用緩沖通道。

下面的代碼將檢查是否可以從通道接收值。

package main


import "fmt"


func multiply(c chan int, num int) {

? ? c <- num * 10

}


func main() {

? ? c := make(chan int, 3)


? ? go multiply(c, 1)

? ? go multiply(c, 2)

? ? go multiply(c, 3)


? ? for i:=0;i<3;i++{

? ? ? ? ?foo, ok := <- c

? ? ? ? ?if !ok {

? ? ? ? ? ? ? ? fmt.Println("done")

? ? ? ? ? ? ? ? return

? ? ? ? ?}

? ? ? ? ?fmt.Println(foo)

? ? }


}

緩沖通道

通道可以被緩沖。提供緩沖區長度作為初始化緩沖通道的第二個參數:

make(chan?int,?100)

以元素數量表示的容量設置通道中緩沖區的大小。如果容量為零或不存在,則通道是無緩沖的,只有當發送方和接收方都準備就緒時,通信才會成功。否則,如果緩沖區未滿(發送)或不為空(接收),通道將被緩沖并且通信成功而不會阻塞。一個 nil 通道永遠不會準備好進行通信。

在您的情況下,這取決于哪個 go 例程將首先在通道上發送值。您打印的值完全取決于 go 例程。


查看完整回答
反對 回復 2023-03-21
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號