我是通过做一些已经用其他语言完成的问题来学习的。
问题之一是:-
我试过做一个接口类型数组,但也不起作用
func ProdSum(prods interface{},sum int ,depth int){
for id,val:=range prods{
if isArray(val){
ProdSum(val,sum,depth)
}
}
}
type arr []interface{}
func main(){
arra:=arr{5,2,arr{7,-1},3,arr{6,arr{-13,8},4}}
ProdSum(arra,0,1)
}Error :
./prodsum.go:16:14: cannot range over prods (type interface {})发布于 2020-07-07 04:56:14
使用类型断言或类型开关确定值是片还是整数。下面是如何使用类型开关实现此操作:
func sum(value interface{}) int {
switch value := value.(type) {
case arr:
var result int
for _, v := range value {
result += sum(v)
}
return result
case int:
return value
default:
panic("type not handled")
}
}就这样说吧:
a := arr{5, 2, arr{7, -1}, 3, arr{6, arr{-13, 8}, 4}}
n := sum(a)发布于 2020-07-07 04:38:01
声明和初始化数组的方式是正确的,尽管不需要arr类型。
如果没有arr类型,它将如下所示:
myArr := []interface{}{1, 2, []int{7, 8, 3}, 1, []interface{}{3, []interface{}{2, []int{4, 5}}, 6}}现在,您看到的特定错误与片声明无关。它与ProdSum的功能签名有关。
ProdSum接受一个类型为interface{}的参数--它不是一个片段,所以您不能对它进行迭代。您希望参数具有一种类型的[]interface{} (空接口的切片):
func ProdSum(prods []interface{}, sum int, depth int) {
for itr, prod := range prods {
// prod has type: interface{}
}
}请记住,在从片中读取值并对其进行求和时,需要执行类型断言操作。您不能将interface{}添加到任何东西中,因为(在断言到int之前) Go不能将它识别为数字。
https://stackoverflow.com/questions/62768168
复制相似问题