我正在 go 1.18 中測試泛型並查看了這個範例。 我想重新建立該範例,但能夠傳入 int 切片或 float 切片,並且在函數中我將總結切片中的所有內容。
這是我在迭代切片時遇到一些問題的時候。這是我嘗試過的:
package main import "fmt" // numberslice constraint type numberslice interface { []int64 | []float64 } func add[n numberslice](n n) { // want: to range over n and print value of v for _, v := range n { fmt.println(v) } } func main() { ints := []int64{1, 2} add(ints) }
我收到錯誤:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
我該如何達成這個目標?
介面(包含介面約束)的核心類型定義如下:
如果滿足下列條件之一,則介面 t 具有核心類型: 滿意:
存在單一類型u
,它是t類型集中所有類型的底層類型
或t的類型集只包含具有相同元素類型e的通道類型,並且所有有向通道具有相同的方向。
您的介面約束沒有核心類型,因為它有兩個底層類型:[]int64
和 []float64
。
因此您不能在需要核心類型的地方使用它。特別是 range
和 make
。
您可以變更介面以要求基本類型,然後在函數簽章中指定切片:
// still no core type... type number interface { int64 | float64 } // ...but the argument will be instantiated with either int64 or float64 func add[n number](n []n) { for _, v := range n { fmt.println(v) } }
這也有效,但更冗長:
type NumberSlice[N int64 | float64] interface { // one core type []N ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
以上是如何迭代通用函數中傳遞的切片並集? (T無芯型)的詳細內容。更多資訊請關注PHP中文網其他相關文章!