我試圖概括我的一些代碼,我認為我可以將一些通用代碼放在一起,但我遇到了類型系統問題。假設我有一個這樣的界面: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
- 1 回答
- 0 關注
- 136 瀏覽
添加回答
舉報
0/150
提交
取消