在沒有核心類型的泛型函數中迭代切片聯合
在Go 1.18 中,泛型函數允許我們使用類型動態地。然而,在迭代由不同類型組成的切片時遇到挑戰需要額外考慮。
在處理類型限制時,我們必須了解核心類型的概念。當介面中的所有類型都存在單一基礎類型或所有通道具有相同的元素類型和方向時,就存在核心類型。
在初始程式碼範例中:
type NumberSlice interface { []int64 | []float64 }
介面限制 NumberSlice 沒有核心類型,因為它包含多個基礎類型:[]int64 和 []float64。這意味著我們無法覆蓋此介面的切片。
為了克服這個障礙,我們可以修改介面以需要基本類型:
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
這允許我們聲明int64 或 float64 並在通用函數中迭代它們。
或者,我們可以定義一個帶有核心的更明確的介面type:
type NumberSlice[N int64 | float64] interface { ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
此方法確保介面對於所有實作NumberSlice[N] 的類型具有已知的底層類型[]N。
透過進行這些調整,我們可以成功迭代泛型函數中的切片聯合,為我們的程式碼提供了更高的靈活性。
以上是如何在沒有核心類型的情況下迭代 Go 泛型函數中的切片並集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!