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
- 1 回答
- 0 關注
- 88 瀏覽
添加回答
舉報