golang 通道是基于 LIFO 的吗?

drd*_*rdn 1 channel fifo go 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)
}
Run Code Online (Sandbox Code Playgroud)

Him*_*shu 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

Go 操场上的工作代码

缓冲通道

通道可以被缓冲。提供缓冲区长度作为初始化缓冲通道的第二个参数:

make(chan int, 100)
Run Code Online (Sandbox Code Playgroud)

容量(以元素数为单位)设置通道中缓冲区的大小。如果容量为零或不存在,则通道没有缓冲,只有当发送方和接收方都准备好时,通信才能成功。否则,如果缓冲区未满(发送)或非空(接收),则通道被缓冲并且通信成功而不会阻塞。一个 nil 通道永远不会准备好进行通信。

在您的情况下,这取决于哪个 go 例程将首先在通道上发送值。您正在打印的值完全取决于 go 例程。

有关更多信息,请访问Golang 频道