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

具有接口类型和结构指针的通道作为具体类型

具有接口类型和结构指针的通道作为具体类型

Go
米琪卡哇伊 2023-05-15 10:33:54
我试图概括我的一些代码,我认为我可以将一些通用代码放在一起,但我遇到了类型系统问题。假设我有一个这样的界面:type Hashable interface {    GetHash() []byte}我有几个这样的具体类型:type Transaction struct {    Hash                 []byte    `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`}func (m *Transaction) GetHash() []byte {    if m != nil {        return m.Hash    }    return nil}请注意,这些是由 生成的protoc,我可能无法轻易更改它们。虽然类型本身不实现Hashable,但如果我没记错的话,指向结构的指针应该实现。当我创建一个接受类型通道的函数chan Hashable并尝试传入 a 时,问题就出现了chan *Transaction,如下所示:func consume(c chan Hashable) {    // Do something with the elements from c}func main() {    var c2 chan *Transaction    consume(c2)}我当然可以创建一个新结构来重新打包consume所需的字段,但这似乎是一个更糟糕的选择。有没有一个干净的解决方案?
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

问题是:chan *Transaction不是接口 - 它是特定类型。所以它不能实现接口或chan Hashable本质上。您需要使用特定的频道。


您可以使用这样的灌浆将Transaction值动态转换为:Hashable


func convertor(ct chan *Transaction) chan Hashable {

    ch := make(chan Hashable)

    go func() {

        for t := range(ct) {

            ch <- Hashable(t)

        }


    }()

    return ch

}

并打电话


consume(convertor(c2))

https://play.golang.org/p/pd2EfhCehYz


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信