Golang:通过空接口传递频道

时间:2016-02-26 13:23:28

标签: go

我正在尝试做一些似乎应该是微不足道的事情,直到我读完,现在看起来它应该真的很复杂。 ;-) 我敲了一个测试模式来说明: http://play.golang.org/p/Re88vJZvPT

最基本的我试图拥有一个可以从通道读取数据并将其吐出另一个通道的功能。简单。只要您使用所示的推动功能,测试就会执行此操作。 然而,这样做的问题是这样做我需要为我想要推送的每种类型的数据使用不同的推送器功能。 现在我已经使用空接口做了类似的事情,因为推送代码中的任何内容都不关心数据结构中的内容。我无法弄清楚的是当我处理一个无关心的数据结构的渠道时。

为了说明我想要实现的概念,请参阅函数pusher_naive_generic。

然而,这不起作用,所以更多的阅读意味着这样做的方法是利用反射,最后你看到我的pusher_reflect_generic函数(显然这将不会达到与其他人一样的预期功能,它显示在哪里我在被卡住之前得到了)。 这仍然失败,因为我无法从包含chan的接口到从该chan读取的结构。

希望代码比我实际做的更能理解我想要实现的目标。我可以通过显式编写每种类型来完成所有这些工作,但我无法弄清楚如何为任何未来类型编写代码。

1 个答案:

答案 0 :(得分:2)

如果我已正确理解您的问题,那么这可能是解决方案:

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()

}

如果RecvSend不是渠道,请注意Closeio恐慌。