当非默认输入通道时,为什么选择进入时总是选择默认情况?

-3 select channel go

我是新来编程的人。这是我的代码。我试图将值分配给一个结构并将该结构分配给通道。但这不是设置它,而是要使用默认情况。

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 6

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

您必须初始化通道。如果没有接收者,则它必须具有“某些”缓冲区以容纳要在其上发送的元素,否则发送也会阻塞。

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

var oc chan object
oc = make(chan object, 1)
Run Code Online (Sandbox Code Playgroud)

请参阅相关内容:未初始化的通道的行为如何?