戈朗 : Passing channels through empty interfaces

标签 go

我正在尝试做一些看似微不足道的事情,直到我仔细阅读,现在看来它应该非常复杂。 ;-) 我敲了一个测试模式来说明: 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()

}

请注意,如果 ioRecvSendClose 会崩溃不是 channel 。

关于戈朗 : Passing channels through empty interfaces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35652902/

相关文章:

concurrency - 维护打开的 websocket 连接列表的最佳方法是什么?

go - 模板中的 Nil 指针求值...为什么?有更好的策略吗?

go - 这两段 Go 代码是否等价?

go - 如何使用 Sarama 在多个 goroutine 中消费 Kafka 主题?

Go 编译已声明但未使用

mongodb - 使用 mgo 存储嵌套结构

go - 尝试安装依赖项时 VS Code 总是失败

go - 确保 Go Process 中调用的可执行文件在 Process 被杀死时被杀死

Go Colly 不从网站返回任何数据

go - 为什么 os/exec.StderrPipe 的编写器在 Start() 中关闭?