Go泛型中~T为何不能直接用类型参数,仅能用于引用类型参数的切片?
Go泛型中~操作符的使用限制解析
先看报错的代码:
func demo[S ~In, In, Out any](s S, in In, out Out) Out { return out }
报错“type in term ~In cannot be a type parameter”的核心原因是:Go的~操作符不能直接作用于类型参数。
~的作用是匹配“底层类型为某具体类型”的所有类型,但这里的In是一个类型参数,它的具体类型要到函数调用时才会确定,编译器无法提前知晓In的底层类型,自然没办法用~In约束S的类型——~后面必须跟明确的具体类型(如int、string),或是带类型参数的复合具体类型(如切片、map),不能是不确定的类型参数。
再看能正常编译的代码:
func demo[S ~[]In, In, Out any](s S, in In, out Out) Out { return out }
这里~后面跟的是[]In,属于带类型参数的切片复合类型,是明确的类型结构:不管In最终是什么类型,S的底层类型必须是[]In这种切片类型(比如自定义的type MySlice []int,当In为int时,S可以是MySlice或原生[]int),完全符合Go泛型对~操作符的使用规则,所以编译器能正常处理。
简单总结:
~操作符右侧必须是具体类型,或是带类型参数的复合具体类型;- 禁止直接将
~作用在类型参数上(如~In这类写法非法)。
内容的提问来源于stack exchange,提问作者halosky
相关产品推荐
相关产品推荐

