如何解决谁应该分配通道,被调用者的调用者?
我正在尝试使用 Go 设计一个简单的家庭自动化程序。我的灯泡在状态改变时返回消息流。这可以通过回调来处理,或者使用 Go 中的通道可能会更好。
通过回调,很明显灯泡 API 的调用者实现了特定的函数签名并将该函数传递给库。当灯泡改变状态或发生通信错误时,将调用该函数。当客户端不再对更新感兴趣时,库将分配一个完成的函数来调用。例如
type DeviceUpdate = func(Device,error)
type Done = func()
func (client *Client) ObserveDevice(deviceID int,deviceUpdate DeviceUpdate) (Done,error) {
在我的例子中,通道似乎提供了更好的抽象,因为它们可以轻松合并,可以添加缓冲,可以轻松编织中间件等。我对上述声明的通道表示有点挣扎。在这种情况下,Go 中的正确约定是什么,即整个系统上的数据通道、错误通道和完成/关闭操作。
我认为通道应该由类似于函数的调用者分配。通过这种方式,调用者可以在激活整个设置之前正确地实例化通道并连接中间件。
func (client *Client) ObserveDevice(deviceID int,data chan Device,done chan struct{},err chan error) error {
另一方面,使用灯泡库分配通道对于消费者代码来说似乎要简单得多 - 您只需调用一个函数,无需分配 3 个通道。同样,Go time 模块似乎勇敢地走这条路,例如https://golang.org/pkg/time/#After
在我的情况下,让库分配通道将导致如下签名
func (client *Client) ObserveDevice(deviceID int) (data chan Device,err chan error) {
那么,Go 频道分配的标准做法是什么?是调用者 vs 被调用者还是生产者 vs 消费者?
从网络流汇集更新时通常的做法是有 3 个通道 - 数据、错误和完成吗?
我在有关通道和 Go 并发性的文章和视频中进行了一些挖掘,但找不到(可能是由于懒惰)记录的最佳实践。我假设示例中暗示了调用者分配通道。见https://gobyexample.com/closing-channels、https://blog.golang.org/pipelines
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。