从 Go 1.18(很快)开始,你可以定义generic types:
type ModelX[T any] struct {
Data []T
}
使用时泛型类型必须是instantiated,实例化需要类型参数列表:
func main() {
// passing int as type parameter
modelInt := ModelX[int]{Data: []int{1, 2, 3}}
fmt.Println(modelInt.Data) // [1 2 3]
}
一个重要的细节是——与函数1不同——泛型类型在实例化时不能完全省略类型参数。然而:
如果列表是部分的,则所有剩余的类型参数都必须是可推断的。
因此,您可以传递部分列表,前提是所有缺失的类型都可以从显式提供的类型中推断出来。例如:
type Foo[T any, PT *T] struct {
val T
ptr PT
}
只能用第一种类型来实例化,因为第二种可以从第一种推断出来:
func main() {
v := int64(20)
foo := Foo[int64]{val:v, ptr: &v}
fmt.Println(foo)
}
GoTip 游乐场:https://gotipplay.golang.org/p/pV0xPCewUdB
1:规范中的引用是 “对参数化函数的调用可以提供(可能是部分的)类型参数列表,或者如果省略的类型参数可以从普通(非-type) 函数参数。”。此引用不包括参数化类型