为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:通过空接口传递通道

Golang:通过空接口传递通道

Go
万千封印 2021-12-20 10:04:10
我正在尝试做一些看起来应该很简单的事情,直到我读完,现在看起来它应该非常复杂。;-) 我已经敲出了一个测试模式来说明:http : //play.golang.org/p/Re88vJZvPT最基本的,我试图拥有一个可以从一个通道读取数据并将其吐出到另一个通道的函数。简单。只要您使用所示的推动器功能,测试就会执行此操作。然而,这样做的问题是,通过这种方式,我需要为我想要推送的每种类型的数据使用不同的推送器功能。现在我过去用空接口做过类似的事情,因为推送器代码中没有任何东西关心数据结构中的内容。我无法弄清楚的是当我处理一个不受关注的数据结构的通道时。为了说明我想要实现的概念,请参阅函数 pusher_naive_generic。然而,这也不起作用,所以更多的阅读暗示着这样做的方法是利用反射,最后你看到我的 pusher_reflect_generic 函数(显然这不会实现与其他函数相同的预期功能,它显示了我之前到达的位置卡住了)。这仍然失败,因为我无法从包含 chan 的接口获取从该 chan 读取的结构。希望代码比我的话更能说明我想要实现的目标。我可以通过为每种类型显式编码来完成所有这些工作,但我无法弄清楚如何为将来的任何类型编码。
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

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


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


}

需要注意的是Recv,Send和Close如果恐慌i和o不渠道。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号