a
上定义 t
,然后 b
上的 t
应该是相同的。此类代码可以在支持泛型的其他语言中工作,但在 go 中,我在注释行处收到 cannot infer t
编译错误(请参阅此处的 go playground 代码)。在我看来, a
上的类型参数设置为 int
,因此 b
上的类型参数也应设置为 int
。我可以改为调用 newb[int]()
,但这对我来说似乎过于冗长。为什么会出现这种情况?,这是“为什么编译器不能根据返回类型的使用方式推断类型参数?”的变体。答案:因为从 go 1.20 开始,这不是类型推断的工作方式。,类型推断适用于:,类型参数列表使用已知类型参数初始化的替换映射 m(如果有)
普通函数参数的(可能为空)列表(仅在函数调用的情况下),如果您一一检查这些规则:,
newb()
有类型参数列表吗?不。您在调用它时没有指定类型参数。,是否有其他已知的类型参数可以用来推断其他类型参数?不,您根本没有提供任何类型参数。请注意,这种情况适用于您提供部分数量的类型参数的函数调用,例如:,在上面您只能提供 t
,例如float64
,编译器将使用 t -> float64
构造替换映射,然后推断 u -> *float64
,最后,有普通函数参数的列表吗?否。newb
为空。,仅此而已。编译器不会根据函数返回类型的使用方式推断类型参数。,在撰写本文时,正在讨论的相关提案有:,提案:规范:类型推断的通用方法,关于更改类型推理算法更容易实现未来的增强,基于赋值上下文的推断,这取决于对上述提案的接受,