【问题标题】:Golang: Passing channels through empty interfacesGolang:通过空接口传递通道
【发布时间】:2016-06-09 17:43:28
【问题描述】:

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

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

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

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

希望代码比我的话更能说明我想要实现的目标。我可以通过为每种类型显式编码来完成所有这些工作,但我不知道如何为 any 未来类型编码。

【问题讨论】:

  • pusher_naive_generic 到底有什么不适用的?对我来说它有效play.golang.org/p/t-GrHQGlGf 我建议使用类型断言而不是反射
  • 您是否尝试从任何类型的频道接收?有什么理由不只使用reflect.(*Value).Recv
  • 好的,我知道你做了什么来完成这项工作;-)n_chan := make(chan TestType) out_chan := make(chan TestType) 变为:in_chan := make(chan interface{} ) out_chan := make(chan interface{}) 这是有道理的。但是,我希望能够将连接表达为用户所看到的类型,而不是空通道。我曾尝试在实例阶段进行类型断言以避免必须这样做,但我无法做到这一点。我只是想以与其他无渠道类型相同的方式使这种对用户透明
  • 我认为 OP 很困惑为什么 chan TestType 不能断言/转换为 chan interface{}。是这个问题吗,OP?
  • 是的,这是我试图保持清洁的外部用户界面,而不是强迫他们将其声明为空界面的通道

标签: go


【解决方案1】:

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

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

}

请注意,如果 io 不是频道,RecvSendClose 会出现恐慌。

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2020-12-19
    • 2017-12-03
    • 2018-02-14
    • 2022-01-24
    • 2014-05-02
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多