当非默认是输入通道时,为啥 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 中的选择总是进入默认情况?的主要内容,如果未能解决你的问题,请参考以下文章
小白求教 为啥我在命令行中汇编*.asm文件时总是打开PROTEL软件呢?