为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信