我可以构造一个具有不同类型参数的通用类型的切片吗?

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],您必须明确提供它,没有什么可以推断的。