如何在Go 1.18 中使用泛型來建立類型化值
在Go 程式設計中,泛型可以建立操作各種類型的程式碼無需顯式轉換或型別斷言。本文探討如何利用 Go 1.18 中的泛型來建立類型值的新物件。
背景:Fruit Factory 示例
考慮以下簡化的“Fruit Factory”示例一般嘗試創建新的水果實例:
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How do we create a non-nil fruit here? // Returning nil crashes the example. return nil } type Apple struct { color string }
在此範例中,任務是完成Create 函數建立T 類型的新實例(即Apple 類型中的*Apple)。然而,僅僅傳回 nil 是不夠的,並且會導致程式在存取物件的屬性時崩潰。
解決方案:建立類型化物件
建立類型化物件有兩種主要方法在 Go中使用泛型的類型化值的新實例1.18:
func (f FruitFactory[T]) Create() *T { var a T return &a }
func (f FruitFactory[T]) Create() *T { return new(T) }
這些解決方案允許函數創建非指標值(a 或new(T)),並在必要時透過返回其位址將其轉換為指針類型( &a).
範例實作
在「水果工廠」範例:
func (f FruitFactory[T]) Create() *T { var a T return &a } func example() { appleFactory := FruitFactory[Apple]{} apple := appleFactory.Create() apple.color = "red" // No panic now }
此修改允許建立新的Apple 物件並設定其屬性,而不會遇到分段錯誤。
結論
透過 Go 1.18 中的泛型,使用類型化值進行程式設計得到了極大的簡化。透過利用聲明性賦值或 new 關鍵字,可以無縫建立任何類型的新實例,從而無需手動轉換和容易出錯的類型斷言。
以上是Go 1.18 中的泛型如何解決建立類型值的問題而不導致程式崩潰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!