揭示聯合切片上的泛型迭代(解決「T 沒有核心類型」)
Go 泛型的探索仍在繼續,這次是深入研究面臨一個有趣的挑戰:迭代切片的並集。我們的目標是建立一個通用函數,可以處理整數切片和浮點數切片,然後將它們的內容加總。
我們最初的嘗試遇到了障礙:
type NumberSlice interface { []int64 | []float64 } func add[N NumberSlice](n N) { for _, v := range n { fmt.Println(v) } }
我們收到了錯誤「範圍不能超過n(N 類型的變數受NumberSlice 約束)(N 沒有核心類型)。」這個錯誤源於通用介面約束缺乏核心類型。
理解核心類型至關重要。當介面的類型集具有單一底層類型或僅由具有相同元素類型的通道類型和具有相同方向的定向通道組成時,就存在核心類型。不幸的是,我們的介面約束不滿足這些條件,因為它有兩種基礎類型:[]int64和[]float64。
要解決這個問題,我們可以重新定義我們的介面以要求基本類型並傳遞一個切片基本類型作為函數參數:
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
或者,我們可以使用更詳細的方法和專門的NumberSlice類型參數:
type NumberSlice[N int64 | float64] interface { ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
透過利用這些技術,我們可以有效地迭代聯合切片並在泛型函數中執行所需的操作。
以上是如何在 Go 泛型中迭代聯合切片並解決'T has no core type”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!