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

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

使用具有不同運行時類型的通用容器

使用具有不同運行時類型的通用容器

Go
蕭十郎 2022-10-04 19:26:38
我目前正在嘗試通過通道將數據發送到戈魯廷,然后戈魯廷將進一步處理它。我的問題是,我希望頻道能夠與任何類型一起使用。為此,我正在研究Go 1.18中新引入的泛型。我的問題是,當我啟動它時,我需要告訴goroutine通道的類型,這是不可能分辨的,因為它可以保存任何數據。這就是我現在得到的:線:func StartController[T any](sender chan Packet[T]) {    go runThread(sender)}func runThread[T any](sender chan Packet[T]) {    fmt.Println("in thread")    for true {        data := <- sender        fmt.Println(data)    }}我的測試函數是這樣的:func main() {    sender := make(chan Packet)    StartController(sender)    sender <- Packet[int]{        Msg: Message[int]{            Data: 1,        },    }    sender <- Packet[string]{        Msg: Message[string]{            Data: "asd",        },    }    for true {}}類型:type Message[T any] struct {    Data T}type Packet[T any] struct {    Msg Message[T]}現在,由于以下原因,此代碼無法編譯.\test.go:8:22: cannot use generic type Packet[T interface{}] without instantiation有沒有辦法正確地做到這一點?我正在考慮不使用泛型,而只使用接口{}作為類型,但這會使整個邏輯變得混亂,因為它需要解析(甚至可能是不可能的,因為數據可能相當復雜(嵌套結構))
查看完整描述

1 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

這是使用泛型的錯誤方法。


參數化類型(如)必須先使用具體類型參數進行實例化,然后才能使用它。給定一個已定義的 chan 類型:chan T


type GenericChan[T any] chan T

您仍然需要使用具體類型實例化它:


c := make(GenericChan[int])

這使得使用類型參數有點沒有意義。


我不知道你的背景是什么,但考慮一下泛型長期以來一直穩定的語言。例如,爪哇。并考慮典型的 Java 通用收集器 。您通常要做的是使用類型實例化它:List<T>


var list = new ArrayList<String>(); 

您在這里嘗試做的是聲明一個可以采用任何類型的通道。在Java中,可以包含任何類型的列表是什么?


var list = new ArrayList<Object>(); 

在圍棋中,那無非是別的


c := make(chan interface{})

你可以用另一種方式來看待它:你如何期望這個通用的chan在接收操作上工作?


c := make(GenericChan) // wrong syntax: instantiating without type param

c <- "a string"        // let's pretend you can send anything into it


// ...


foo := <-c 

在這一點上,什么是?是 ?還是一個?你可以發送任何東西。這就是為什么像你的例子中的通用chan不能按照你的意圖工作。它必須是,然后你類型斷言收到的項目,就像你現在沒有泛型一樣。foostringintchan interface{}


泛型的要點是編寫使用任意類型的代碼,同時保持類型安全:


func receiveAny[T any](c chan T) T {

    return <-c

}

您可以使用 或 .chan intchan string


查看完整回答
反對 回復 2022-10-04
  • 1 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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