Go 如何制作变量类型切片

Go 如何制作变量类型切片,go,Go,我在学习围棋,我已经用其他语言完成了一些问题 所以问题之一是:- 求数组中元素的和 Arr=[1,2,7,8,3],1,3,2,4,5,6]] 我尝试过制作接口类型数组,但也没有成功 func ProdSum(prods interface{},sum int ,depth int){ for id,val:=range prods{ if isArray(val){ ProdSum(val,sum,depth)

我在学习围棋,我已经用其他语言完成了一些问题

所以问题之一是:-

  • 求数组中元素的和 Arr=[1,2,7,8,3],1,3,2,4,5,6]]
我尝试过制作接口类型数组,但也没有成功

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)
}
错误:
./prodsum.go:16:14:无法在prods上设置范围(类型接口{})

声明和初始化数组的方式是正确的,尽管您不需要
arr
类型

如果没有
arr
类型,它将如下所示:

a := arr{5, 2, arr{7, -1}, 3, arr{6, arr{-13, 8}, 4}}
n := sum(a)

现在,您看到的特定错误与切片声明无关。它与
ProdSum
的函数签名有关

ProdSum
接受类型为
interface{}
的参数,该参数不是切片,因此无法对其进行迭代。您希望参数的类型为
[]接口{}
(空接口的一部分):

请记住,在从切片中读取值并求和它们时,需要执行以下操作。无法向任何内容添加
接口{}
,因为(在对
int
进行断言之前)Go无法将其识别为数字。

使用或来确定值是切片还是整数。下面是如何使用类型开关执行此操作:

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)

a := arr{5, 2, arr{7, -1}, 3, arr{6, arr{-13, 8}, 4}}
n := sum(a)