2 回答
TA贡献1828条经验 获得超6个赞
您可以像往常一样将值转换为参数类型。
从提案类型转换:
在具有两个类型参数
From
和的函数中,如果From 约束的类型集中的所有类型都可以转换为 To 约束的类型集中的所有类型,则 type 的值可以转换为 type 的值To
。From
To
在这种情况下,您实际上并没有 aFrom
因为它是切片索引int
;目标类型将是T
(即使这可能不是您想要的,请参阅下面的原因)。当然int
可以转换为T
' 类型集,因为它仅包括数字类型(尽管在or 的情况下会截断或丢失精度int8
!float64
)
indexs = append(indexs, T(i))
但是您的程序将索引切片声明为[]T
,这意味着将您的通用函数实例化为:
is := FindIndexValue([]float64{1,5,7,9}, float64(9))
将产生类型的结果[]float64
。由于返回的值是切片索引,总是int
,这没有多大意义。
最好简单地返回[]int
:
func FindIndexValue[T Number](array []T, value T) []int {
var indices []int
for i := range array {
// match on the generically typed slice item
if array[i] == value {
// store slice indices as ints
indices = append(indexs, i)
}
}
return indices
}
游乐场:https ://gotipplay.golang.org/p/EykXppG2qJa
TA贡献1799条经验 获得超6个赞
int无论切片的元素类型如何,索引始终是整数类型 ( )。所以结果类型应该是[]int.
你为什么要这样[]T?如果T是uint8并且传递的切片包含超过 256 个元素,您甚至无法返回正确的索引。
func FindIndexValue[T types.Number](array []T, value T) []int {
var indices []int
for i, v := range array {
if v == value {
indices = append(indices, i)
}
}
return indices
}
- 2 回答
- 0 关注
- 105 浏览
添加回答
举报