我正在阅读有关使用 go
构建 Web 服务器的教程。 .
作者,而不是直接使用http.ListenAndServe()
方法,他创建了 http.Server
结构。
然后他继续:
serverErrors := make(chan errors, 1)
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/