当非默认是输入通道时,为啥 go 中的选择总是进入默认情况?

Posted

技术标签:

【中文标题】当非默认是输入通道时,为啥 go 中的选择总是进入默认情况?【英文标题】:Why a select in go always goes to default case when non default is a input channel?当非默认是输入通道时,为什么 go 中的选择总是进入默认情况? 【发布时间】:2019-12-30 08:41:14 【问题描述】:

我是编程新手。这是我的一段代码。我正在尝试为结构分配值并将该结构分配给通道。但它没有设置它并进入默认情况。

package main
import (
    "fmt"
)
type object struct 
    a int
    b string

func main() 

    o1 := object
        a: 25,
        b: "quack",
    

    var oc chan object
    select 
    case oc <- o1:
        fmt.Println("Chan is set")
    default:
        fmt.Println("Chan is not set")
    

【问题讨论】:

选择中的任何case 仅当它可以发生时才会发生。如果没有人可以从您的 oc 中读取(或者在您的情况下更糟糕的是您没有制作的 oc),则会发生默认值。围棋之旅详细解释了这一点。 【参考方案1】:

您从未初始化oc 频道,所以它是nil,并在nil 频道上发送永远阻塞。如果没有现成的案例,select 语句会选择 default

您必须初始化频道。如果没有接收者,它必须有“一些”缓冲区来容纳你想要发送的元素,否则发送也会阻塞。

这可以按照您想要的方式工作(在Go Playground 上尝试):

var oc chan object
oc = make(chan object, 1)

查看相关:How does a non initialized channel behave?

【讨论】:

以上是关于当非默认是输入通道时,为啥 go 中的选择总是进入默认情况?的主要内容,如果未能解决你的问题,请参考以下文章

并发——轻量级线程,通道,单向通道

为啥这个简单的switch语句总是运行默认

小白求教 为啥我在命令行中汇编*.asm文件时总是打开PROTEL软件呢?

手机微信打开文件为何总是qq浏览器 为啥用微信打开文件总是跳转qq浏览器

是否可以在处理时向Go频道添加项目?

027_go语言中的通道选择器