使用介面約束處理泛型函數中的切片聯合
假設您需要一個對整數切片或整數切片進行操作的泛型函數一片漂浮物。要實現這一點,您可以利用泛型和介面約束,如下所示:
package main import "fmt" // NumberSlice defines an interface for either slice of integers or slice of floats. type NumberSlice interface { []int | []float64 } // add is a generic function that iterates over a slice of NumberSlice and prints its values. func add[N NumberSlice](n N) { for _, v := range n { fmt.Println(v) } } func main() { ints := []int{1, 2} add(ints) floats := []float64{3.14, 1.618} add(floats) }
但是,當嘗試執行上述程式碼時,您可能會遇到以下錯誤:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
出現此錯誤的原因是NumberSlice 介面沒有核心類型。介面的核心類型是介面中的所有類型都必須繼承的單一基礎類型。由於 NumberSlice 既可以接受整數切片,也可以接受浮點數切片,因此它不符合此要求。
要解決此問題,您可以使用基本類型而不是切片來定義介面:
type Number interface { int | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
這個修改後的函數將Number 元素的切片作為參數,使其能夠有效地處理整數和浮點數。
以上是如何處理 Go 泛型函數中的切片並集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!