Go频道和Java BlockingQueue之间有什么区别吗?两者都是具有相似阻塞和内存模型语义的队列.可选地,两者都可以具有容量集.

推荐答案

我想说最大的区别是Go通道支持select语句,它允许您只执行一个通道操作.一个例子(从Go language specification改为Go language specification):

select {
case i1 = <-c1:
    print("received ", i1, " from c1\n")
case c2 <- i2:
    print("sent ", i2, " to c2\n")
case i3, ok := (<-c3):  // same as: i3, ok := <-c3
    if ok {
        print("received ", i3, " from c3\n")
    } else {
        print("c3 is closed\n")
    }
}

在此示例中,将恰好执行从c1接收、向c2发送或从c3接收操作之一.进入SELECT时,随机 Select 就绪频道(如果有).否则,操作将阻塞,直到其中一个通道就绪.

我不知道有任何简单的方法可以使用Java实用程序对此频道 Select 进行建模.有人可能会争辩说,这是select语句的一个属性,而不是频道的设计,但我会争辩说,这是频道设计的基础.

Go相关问答推荐

golang 的条件储存库

如何在使用中介资源时处理函数中的`defer`

JetBrains Goland,禁用突出显示测试文件

无法获取RPC描述符

Go Gin:验证 base64

Go安装成功但没有输出简单的Hello World

是否可以使用标准库构建 Go 二进制文件?

命令行参数在 Golang 程序中不正确地接受为参数

如何在 Go msgraph-sdk-go 中转发消息并包括抄送和/或密送收件人?

带有前导零的整数参数被 flag.IntVar 解析为八进制

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

有没有办法计算枚举中定义的项目总数?

为超时的单元测试创​​建 deadlineExceededError:true

使用 GO 在侧 tar 文件中提取 tar 文件的最快方法

为什么此代码在运行命令 error="exec: not started" 时出现错误?

使用go doc命令查看示例函数?

级联调用泛型函数时的泛型类型推断

Go 并发、goroutine 同步和关闭通道

在 Raspberry Pi4 上下载 Go Mod

Go 使用 struct 作为接口而不实现所有方法