Go泛型:如何创建spMyInt与spMyInt2类型的实例?
Go泛型类型创建问题解决
先看定义的泛型类型:
type N interface{ ~int | ~float32 | ~float64 } type S[T any] struct { t T } type myInt int // 基于*S[*T]定义的泛型新类型 type pSpMyInt[T myInt] *S[*T] // 类型参数约束为*myInt的泛型新类型,原定义里的逗号是多余的,建议删除 type spMyInt[T *myInt] S[T] // 基于S[*T]定义的泛型新类型 type spMyInt2[T myInt] S[*T]
能成功创建pSpMyInt类型变量,但创建spMyInt和spMyInt2时遇到问题,比如尝试创建spMyInt2的代码编译失败:
func createSP[T myInt]() spMyInt2[T] { var i T s := S[*T]{t: &i} return s }
报错信息:
cannot use s (variable of type S[*T]) as type spMyInt2[T] in return statement
问题根源
在Go中,通过type NewType OriginalType(不带等号)定义的是全新的自定义类型——哪怕底层类型和原类型完全一致,两者也不属于同一类型,不能直接赋值或返回,必须通过显式类型转换完成。
修复方案
1. 修复spMyInt2的创建代码
只需要在返回时对s做显式类型转换:
func createSP[T myInt]() spMyInt2[T] { var i T s := S[*T]{t: &i} return spMyInt2[T](s) // 显式转换为目标自定义类型 }
2. 创建spMyInt类型变量
spMyInt的类型参数约束是*myInt,创建时要传入符合约束的类型参数,同时同样需要显式转换:
// 带泛型参数的创建函数 func createSP1[T *myInt]() spMyInt[T] { var i myInt s := S[T]{t: &i} return spMyInt[T](s) } // 调用示例 func main() { // 显式指定类型参数 sp := createSP1[*myInt]() fmt.Println(sp) }
如果想简化调用,也可以写一个不需要传参的版本:
func createSP1() spMyInt[*myInt] { var i myInt s := S[*myInt]{t: &i} return spMyInt[*myInt](s) }
内容的提问来源于stack exchange,提问作者Zaphod
相关产品推荐
相关产品推荐

