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 关注
- 56 浏览
添加回答
举报