go - 在收听和服务时使用缓冲 channel 处理错误

标签 go goroutine

我正在阅读有关使用 go 构建 Web 服务器的教程。 .

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

然后他继续:

  • 创建用于监听错误的缓冲 channel

    serverErrors := make(chan errors, 1)
    
  • 生成绑定(bind)到该 channel 的 http 监听 goroutine

    go func(){
        fmt.Println("starting...")
        serverErrors <- api.ListenAndServe()
    }()
    

  • 使用缓冲 channel 的原因是根据讲师的说法

    so that the goroutine can exit if we do not collect this error



    在程序下面确实有 select正在收集来自此 channel 的错误的 block 。

    如果我们不收集错误,任何人都可以帮助我了解 goroutine 如何退出?

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

    最佳答案

    简短的回答:

    对于任何 channel (缓冲或不缓冲),如果没有任何内容写入 channel ,则 channel 读取 block 。

    对于非缓冲 channel ,如果没有人在听, channel 写入将阻塞。

    这是一种使用错误 channel 的常用技术(因为只有一个项目会被写入 channel ),使其成为大小为 1 的缓冲 channel 。它确保写入不会阻塞 - 并且编写器 goroutine 可以继续其方式和返回。

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

    注意:要回收一个 channel 重新 GC,它只需要超出范围 - 它不需要完全耗尽。也不需要关闭。一旦它从两端超出范围,它将被 GC'ed。

    关于go - 在收听和服务时使用缓冲 channel 处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59444908/

    相关文章:

    go - 在 map 中存储多个值

    go - go get 取包时如何切换到golang.google.cn?

    image - Golang Websocket 检测文件消息并在超过 1 个 ws 帧字节时写入

    go - Go 有类似 Java 的 ThreadLocal 的东西吗?

    concurrency - 在 goroutine 中选择评估所有其他语句

    go - 如何将golang类型结构中的列类型定义为longtext?

    go - 对goroutines中的延迟感到困惑

    go - Goroutine 中关于关键字 "go"和没有关键字的比较

    go - 检测 Go 例程中断

    go - 为什么这个函数不能退出?