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

我试图概括我的一些代码,我认为我可以将一些通用代码放在一起,但我遇到了类型系统问题。


假设我有一个这样的界面:


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所需的字段,但这似乎是一个更糟糕的选择。


有没有一个干净的解决方案?


米琪卡哇伊
浏览 117回答 1
1回答

达令说

问题是:chan *Transaction不是接口 - 它是特定类型。所以它不能实现接口或chan Hashable本质上。您需要使用特定的频道。您可以使用这样的灌浆将Transaction值动态转换为:Hashablefunc convertor(ct chan *Transaction) chan Hashable {&nbsp; &nbsp; ch := make(chan Hashable)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; for t := range(ct) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ch <- Hashable(t)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }()&nbsp; &nbsp; return ch}并打电话consume(convertor(c2))https://play.golang.org/p/pd2EfhCehYz
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go