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 例程。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報