2 回答

TA貢獻1880條經驗 獲得超4個贊
接口(包括接口約束)的核心類型定義如下:
如果滿足以下條件之一,則接口 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)
}
}

TA貢獻1810條經驗 獲得超5個贊
這樣的事情對你有用嗎?
package main
import "fmt"
type NumberOrFloat interface {
int64 | float64
}
func add[N NumberOrFloat](n []N) {
for _, v := range n {
fmt.Println(v)
}
}
func main() {
ints := []int64{1, 2}
add(ints)
}
這里的區別在于你定義了數組元素的類型約束(而不是數組類型):[]N
- 2 回答
- 0 關注
- 98 瀏覽
添加回答
舉報