php小編西瓜為您帶來了最新的資訊-「Go 泛型:無效的複合文字」。在Go語言社群中,泛型一直是備受關注的議題。隨著Go 1.18版本的發布,泛型將正式納入Go語言的標準函式庫。然而,這項決定並不是所有人都能接受的。本文將探討泛型在Go語言中的實現方式以及相關的爭議和討論,幫助讀者更好地理解這項技術,並為其在實際開發中的應用提供參考。
以下程式碼會導致錯誤「無效的複合文字類型 t」。
package main import "fmt" func main() { fmt.Println(createThing[foo]()) } type thing interface { foo | bar } type foo struct { id int a string } type bar struct { id int b int } func createThing[T thing, P *T]() P { return &T{} }
如果我只在介面thing
中包含thing
#,或刪除a string
和b int
,那麼foo
和bar
完全相同,程式碼將運行沒有錯誤。然而,這是否違背了泛型的目的?為什麼我不能實例化這樣的泛型類型,尤其是當我什至沒有訪問任何字段時?
可能與 https://github.com/golang/go/issues/48522 相關
大多數泛型類型對於複合文字來說不是有效類型。但這不是問題,因為還有其他方法可以建立泛型類型的值。
建立指向新零值的指標:
func creatething[t thing]() *t { return new(t) }
或建立一個非指標零值:
func createThing[T thing]() T { var value T return value }
至於為什麼以這種方式發生錯誤,這裡是規範中的解釋,經過修改以解決您的特定問題。
對於複合文字:
literaltype 的核心類型 t 必須是結構體、陣列、切片或映射類型
核心類型是什麼?
介面 t 具有核心類型,如果 [...] 存在單一類型 u,它是 t 類型集中所有類型的基礎類型
沒有其他介面具有核心類型。
底層型別是什麼?
每個類型 t 都有一個基礎類型:如果 t 是預先宣告的布林、數字或字串類型之一,或類型文字,則對應的基礎類型是 t 本身。否則,t 的基礎類型是 t 在其聲明中引用的類型的基礎類型。
「類型文字」可以指文字結構類型,例如 struct{int id}
。因此,當foo
和bar
都具有struct{int id}
的底層類型時,則thing
具有struct{int id}
的核心型別,因此複合文字是可能的。當 foo
和 bar
沒有相同的底層類型時,則 thing
沒有核心類型,並且複合文字是不可能的,因此您的錯誤。
正式的定義可能看起來很複雜,但結果和實際要點很簡單:泛型程式碼只能表達可能類型的常見行為。除了在所有基礎類型都相同的特殊情況下,文字值並不是常見的行為。
以上是Go 泛型:無效的複合文字的詳細內容。更多資訊請關注PHP中文網其他相關文章!