You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:36:21