亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有接口類型和結構指針的通道作為具體類型

具有接口類型和結構指針的通道作為具體類型

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 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號