我包装了一个队列来实现 Writer
和 Reader
接口(interface)(分别用于推送和弹出)。
我需要持续监听队列,并处理通过的每条消息。当队列表示为 channel 时,这很简单,否则就更难了:
loop:
for {
var data []byte
select {
case <-done:
break loop
case _, err := queue.Read(data):
fmt.Println(string(data))
}
}
执行此操作的正确方法是什么? Read
这里是阻塞的——它一直等到队列有消息。
是否有更好、更惯用的方法来实现这一点?
最佳答案
采用同步 API(如上面描述的 queue.Read)并使其异步比相反的操作更难。
我们的想法是创建一个新的 goroutine(例如使用 go func() {...})并让该 goroutine 执行读取并将输出写入 channel 。
然后第一个 goroutine 将阻塞该 channel 和它已经阻塞的 channel 。
如果读取时间过长,这可能会留下孤立资源一段时间,但如果您有同步 API,这是您能做的最好的事情。
关于go - 在 select 语句中使用 Reader 接口(interface)时的约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028252/