【发布时间】:2014-10-24 22:43:00
【问题描述】:
我正在尝试为订阅编写一个通用包装器,例如:
type Subscriber interface{
Subscribe(addr string) chan interface{}
}
假设我想使用一个库,其中有一个订阅方法,但它使用了chan library.Object。我希望能够做类似的事情:
func (s *mySubscriber) Subscribe(addr string) chan interface{}{
ch := make(chan library.Object)
library.Subscribe(addr, ch)
return chan interface{}(ch)
}
目前,我认为这样的演员阵容是不可能的。而且我不想修改底层库,因为包装器应该与库实现无关。
我见过Is there a way to cast Structs for sending over a channel,但在这种情况下,可以修改应用程序以满足需要。在这里,它不能。这可能吗?有没有更好的办法?
一种解决方案是将通用频道传递给订阅,并在chan library.Object 上无限期地等待并触发我的通用频道上的任何内容,但我并不特别喜欢必须引入另一个频道才能获得围绕类型转换。
【问题讨论】:
-
Go 没有“演员”的概念。进行类型转换、类型断言和接口(以及类型切换),仅此而已。类型转换最接近强制转换,例如C. 谈论强制转换和强制转换不起作用只会模糊您对必须通过使用类型转换来解决的问题的看法(在您的情况下不起作用!),巧妙地使用接口和适当的类型断言/开关可能与反射。 Go 中的大多数“通用”东西注定会失败或因深陷反思而变得缓慢。
标签: interface casting go publish-subscribe channel