我正在尝试为订阅编写一个通用包装器,例如:type Subscriber interface{ Subscribe(addr string) chan interface{}}假设有一个我想使用的库,它有一个 subscribe 方法,但它使用chan library.Object. 我希望能够执行以下操作:func (s *mySubscriber) Subscribe(addr string) chan interface{}{ ch := make(chan library.Object) library.Subscribe(addr, ch) return chan interface{}(ch)}目前,我不相信这样的演员阵容是可能的。而且我不想修改底层库,因为包装器应该与库实现无关。我已经看到有没有办法将结构转换为通过通道发送,但在这种情况下,可以修改应用程序以满足需要。在这里,不能。这可能吗?有没有更好的办法?一种解决方案是将通用通道传入 Subscribe,并无限期地等待chan library.Object和触发通过我的通用通道的任何内容,但我并不特别喜欢为了绕过类型转换而必须引入另一个通道。
2 回答
慕森卡
TA贡献1806条经验 获得超8个赞
对于偶然发现这个问题并想要一些内联代码的其他人:
// wrap a timeout channel in a generic interface channel
func makeDefaultTimeoutChan() <-chan interface{} {
channel := make(chan interface{})
go func() {
<-time.After(30 * time.Second)
channel <- struct{}{}
}()
return channel
}
// usage
func main() {
resultChannel := doOtherThingReturningAsync()
cancel := makeDefaultTimeoutChan()
select {
case <-cancel:
fmt.Println("cancelled!")
case results := <-resultChannel:
fmt.Printf("got result: %#v\n", results)
}
}
- 2 回答
- 0 关注
- 272 浏览
添加回答
举报
0/150
提交
取消