我正在尝试做一些看似微不足道的事情,直到我仔细阅读,现在看来它应该非常复杂。 ;-) 我敲了一个测试模式来说明: http://play.golang.org/p/Re88vJZvPT
在最基本的情况下,我试图拥有一个可以从 channel 读取数据并将其输出到另一个 channel 的功能。简单。只要您使用显示的推送器功能,测试就会执行此操作。 然而,这样做的问题是,这样做对于我想要推送的每种类型的数据,我都需要一个不同的推送器函数。 现在我过去用空接口(interface)做过类似的事情,因为推送代码中没有任何内容关心数据结构中的内容。我无法弄清楚的是,当我处理一个不受关注的数据结构的 channel 时。
为了说明我要实现的概念,请参阅函数 pusher_naive_generic。
然而,这也不起作用,所以更多的阅读暗示这样做的方法是利用反射,最后你看到我的 pusher_reflect_generic 函数(显然,这不会实现与我在其中显示的其他函数相同的预期功能在卡住之前必须这样做)。 这仍然失败,因为我无法从包含 chan 的接口(interface)获取从该 chan 读取的结构。
希望代码比我的话更能说明我要实现的目标。我可以通过为每种类型显式编码来完成所有这些工作,但我不知道如何为任何 future 类型编码。
最佳答案
如果我正确理解了您的问题,那么这可能就是解决方案:
http://play.golang.org/p/xiDO7xkoW4
func forwardChannel(i interface{}, o interface{}) {
it, ot := reflect.TypeOf(i), reflect.TypeOf(o)
if it != ot {
panic("forwardChannel: both arguments must be of the same type")
}
iv, ov := reflect.ValueOf(i), reflect.ValueOf(o)
for {
v, k := iv.Recv()
if !k {
break
}
ov.Send(v)
}
ov.Close()
}
请注意,如果 i
和 o
,Recv
、Send
和 Close
会崩溃不是 channel 。
关于戈朗 : Passing channels through empty interfaces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35652902/