golang 频道是基于 LIFO 的吗?

我想知道 golang 频道中元素的顺序。运行几个例子后,似乎元素从通道中出来的顺序是“后进先出”。我对吗?


以下代码段是我使用的示例。运行代码后,输出为 20 10,而 10 首先发送到通道,最后发送 20。


package main


import "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)

}


犯罪嫌疑人X
浏览 93回答 1
1回答

肥皂起泡泡

Golang 通道不是 LIFO。通道充当先进先出队列。例如,如果一个 goroutine 在通道上发送值,而第二个 goroutine 接收它们,则值按发送顺序接收。只要通道的接收者准备就绪,通道上发送的值就会被接收。如果没有,它就会阻塞。为了管理它,您可以使用缓冲通道。下面的代码将检查是否可以从通道接收值。package mainimport "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 例程。
打开App,查看更多内容
随时随地看视频慕课网APP