当前位置: 首页 > 面试题库 >

未初始化的通道表现如何?

岳永思
2023-03-14
问题内容

我有一个包含未初始化通道的结构。

当我向它写入内容时,该例程将按预期方式阻塞,但是永远不会通知读者管道中有东西。

我很惊讶没有错误,我想知道Go在做什么。

在下面的示例中,消息pushed和消息got it均未打印。(取消注释初始化,它将像超级按钮一样起作用)

type MyStruct struct {
    over chan bool
}

func main() {
    nonInitialized := &MyStruct{}
    // nonInitialized.over = make(chan bool)
    go func() {
        for i := 0; i < 10; i++ {
            select {
            case <-nonInitialized.over:
                fmt.Println("got it")
            default:
                // proceed
            }
            fmt.Println("do some stuff")
            time.Sleep(10 * time.Millisecond)
        }
        panic("took too long")
    }()
    // push on the non initialized channel
    fmt.Println("pushing")
    nonInitialized.over <- true
    fmt.Println("pushed")
}

这是操场https://play.golang.org/p/76zrCuoeoh

(我知道我应该初始化通道,这不是问题的目的,我想知道使用未初始化的通道在Go中发生了什么。)


问题答案:

通道类型的“未初始化”字段或变量的所有通道类型的零值为nil。因此,让我们研究一下nil通道或通道上的操作。

值得 在一篇文章中收集 渠道公理

  • nil通道上的发送将永远阻塞(规范:Send语句)
  • 来自nil通道的接收将永远阻塞(规范:接收运算符)
  • 发送到封闭通道恐慌(规范:Send语句)
  • 来自封闭通道的接收立即返回零值(规范:接收运算符)

nil通道阻塞的原因:如果一个通道值为nil,则没有人引用它,因此没有人会准备好从中接收(我们要发送的内容);或发送任何内容(我们会从中收到什么)。

您可以在Dave Cheney:Channel Axioms中阅读更多的推理和更多详细信息。

为了完整性:

  • 关闭一个nil频道将会引起一个运行时恐慌(就像闭一个已经封闭的通道)。
  • 长度和容量一个的nil信道是0; 根据nil具有0长度和容量的切片和地图。

理由:“关闭”是一种状态,但是一个nil通道不能具有状态(只有一个nil通道,“关闭”通道没有一个通道,“非关闭”通道没有一个通道)。而且没有元素在nil通道中排队(因此len
= 0),并且它没有缓冲区容量(因此cap = 0)。



 类似资料:
  • 以下是我的配置 java版本“1.8.0_101”java(TM)SE运行时环境(构建1.8.0_101-b13)java热点(TM)64位服务器虚拟机(构建25.101-b13,混合模式) 使用Apache http客户端v4.4调用Restful服务,服务URL具有有效的证书(SHA2) 我们使用apache http客户端调用服务。下面是代码 服务调用是间歇性失败的,有一个批处理过程在一个循

  • 我正在尝试运行一个Spring项目。pom.xml: 结果是这样的: 2017-08-17 01:11:01.405信息9156---[restartedMain]org.ocp.TestruleemallApplication:在桌面上启动TestruleemallApplication-PL25CTR,PID 9156(C:\Users\Ilias\DesktoP\TestRuleEmall\

  • 本文向大家介绍tensorflow 初始化未初始化的变量实例,包括了tensorflow 初始化未初始化的变量实例的使用技巧和注意事项,需要的朋友参考一下 今日在Stack Overflow上看到一个问如何只初始化未初始化的变量,有人提供了一个函数,特地粘贴过来共大家品鉴: 通过tf.global_variables()返回一个全局变量的列表global_vars, 然后以python列表解析式的

  • 考虑如下代码: vector<double> v = { 1, 2, 3.456, 99.99 }; list<pair<string,string>> languages = { {"Nygaard","Simula"}, {"Richards","BCPL"}, {"Ritchie","C"} }; map<vector<string>,vector<int>> years = {

  • 问题内容: 我在用Java工作。 我通常会这样设置一些对象: 问题是:在此示例中是否等于,按原样我可以假定对未初始化的对象进行空检查将是准确的? 问题答案: 正确,未显式初始化的引用类型的静态成员和实例成员都由Java 设置为。相同的规则适用于数组成员。 根据Java语言规范的第4.12.5节: 变量的初始值 程序中的每个变量在使用值之前都必须具有一个值: 每个类变量,实例变量或数组组件在创建时均