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 关注
- 74 浏览
添加回答
举报