我可以构造一个具有不同类型参数的通用类型的切片吗?
Can I construct a slice of a generic type with different type parameters?
在下面的代码中,我有一个包含文字值的标记类型。通过使用空接口,我可以创建一片标记并附加具有不同类型的标记。我不认为使用泛型可以完成同样的事情,因为我们无法推断出令牌切片的类型。这个假设正确吗?
type Token struct {
TokenType string
Literal interface{}
}
func main(){
tok1 := &Token{TokenType: "string", Literal: "foo"}
tok2 := &Token{TokenType: "integer", Literal: 10}
tokS := []*Token{tok1, tok2}
}
Is this assumption correct?
是的。你可以有一片 Token[string] 或 Token[int].
since we wouldn't be able to infer a type for the Slice of tokens. Is this assumption correct?
差不多。更准确地说,Token
的切片不会 推断 任何东西,因为你 你自己 必须使用通用类型的具体实例来构造它.
给定参数化 Token
类型为:
type Token[T any] struct {
TokenType string
Literal T
}
每个具有不同类型参数的实例化都会产生不同的(命名的)类型。
因此,当您使用 Token[T any]
的特定实例构造切片时,不同的实例根本无法分配给其元素类型:
tokS := []*Token[string]{tok1, tok2}
// invalid: cannot use tok2 (variable of type *Token[int]) as type *Token[string] in array or slice literal
唯一可以容纳不同类型的切片,如 Token[string]
和 Token[int]
是 []interface{}
或 []any
。
进一步注意,类型推断用于从已经提供的参数中推断出缺少的类型参数,或者在函数的情况下,从函数参数中推断出缺失的类型参数。泛型 类型 必须使用 non-empty 类型参数列表进行实例化。当类型参数只有一个时,比如 Token[T any]
,您必须明确提供它,没有什么可以推断的。
在下面的代码中,我有一个包含文字值的标记类型。通过使用空接口,我可以创建一片标记并附加具有不同类型的标记。我不认为使用泛型可以完成同样的事情,因为我们无法推断出令牌切片的类型。这个假设正确吗?
type Token struct {
TokenType string
Literal interface{}
}
func main(){
tok1 := &Token{TokenType: "string", Literal: "foo"}
tok2 := &Token{TokenType: "integer", Literal: 10}
tokS := []*Token{tok1, tok2}
}
Is this assumption correct?
是的。你可以有一片 Token[string] 或 Token[int].
since we wouldn't be able to infer a type for the Slice of tokens. Is this assumption correct?
差不多。更准确地说,Token
的切片不会 推断 任何东西,因为你 你自己 必须使用通用类型的具体实例来构造它.
给定参数化 Token
类型为:
type Token[T any] struct {
TokenType string
Literal T
}
每个具有不同类型参数的实例化都会产生不同的(命名的)类型。
因此,当您使用 Token[T any]
的特定实例构造切片时,不同的实例根本无法分配给其元素类型:
tokS := []*Token[string]{tok1, tok2}
// invalid: cannot use tok2 (variable of type *Token[int]) as type *Token[string] in array or slice literal
唯一可以容纳不同类型的切片,如 Token[string]
和 Token[int]
是 []interface{}
或 []any
。
进一步注意,类型推断用于从已经提供的参数中推断出缺少的类型参数,或者在函数的情况下,从函数参数中推断出缺失的类型参数。泛型 类型 必须使用 non-empty 类型参数列表进行实例化。当类型参数只有一个时,比如 Token[T any]
,您必须明确提供它,没有什么可以推断的。