代码之家  ›  专栏  ›  技术社区  ›  pkaramol

监听和服务时使用缓冲通道处理go中的错误

  •  0
  • pkaramol  · 技术社区  · 6 年前

    我正在学习如何使用 go .

    作者,而不是直接使用 http.ListenAndServe() 方法,他创建 http.Server 结构。

    然后他通过:

    • 创建用于侦听错误的缓冲通道
    serverErrors := make(chan errors, 1)
    
    • 生成绑定到该通道的http侦听goroutine
    go func(){
        fmt.Println("starting...")
        serverErrors <- api.ListenAndServe()
    }()
    
    

    使用缓冲通道的原因是根据讲师的说法

    如果我们不收集这个错误,GOOTUTIN可以退出。

    在程序a中确实有 select 从该通道收集错误的块。

    如果我们不收集错误,有人能帮助我理解GODUTIN是如何退出的吗?

    如果我们使用无缓冲信道,实际的区别是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   kostix    6 年前

    简短回答:

    对于任何通道(缓冲或不缓冲),如果没有向通道写入任何内容,通道将读取块。

    对于非缓冲通道,通道 写入 如果没有人在听,就会被堵住。

    这是一种常见的错误通道技术(因为只有一个项目将被写入通道),使其成为大小为1的缓冲通道。它确保写操作不会被阻塞,并且writer goroutine可以继续进行并返回。

    因此,服务不依赖于从错误通道读取的客户端调用方来执行其清理。

    注意:要回收通道re GC,它只需要超出范围-不需要完全排出。也不需要关闭。一旦它从两端超出范围,它将被GC'ed。