在下面的代碼中,我有一個包含文字值的標記型別。通過使用一個空介面,我可以創建一片令牌并附加具有不同型別的令牌。我不認為使用泛型來完成同樣的事情是不可能的,因為我們無法推斷出令牌切片的型別。這個假設正確嗎?
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}
}
uj5u.com熱心網友回復:
因為我們無法推斷 Slice of tokens 的型別。這個假設正確嗎?
幾乎。更準確地說,切片 ofToken不會推斷出任何東西,因為您自己必須使用泛型型別的具體實體來構造它。
給定一個引數化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。
進一步說明,型別推斷用于從已經提供的型別引數中推斷缺失的型別引數,或者在函式的情況下,從函式引數中推斷出缺失的型別引數。泛型型別必須使用非空型別引數串列進行實體化。當型別引數只有一個時,例如Token[T any],您必須明確提供,并且沒有什么可以推斷的。
uj5u.com熱心網友回復:
這個假設正確嗎?
是的。你可以有一片 Token[string] 或 Token[int]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437845.html
