首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作可变类型的切片

如何制作可变类型的切片
EN

Stack Overflow用户
提问于 2020-07-07 04:31:43
回答 2查看 59关注 0票数 0

我是通过做一些已经用其他语言完成的问题来学习的。

问题之一是:-

  • 求Arr数组中元素之和= [1,2,7,8,3,1,[3,[2,4,5],6]

我试过做一个接口类型数组,但也不起作用

代码语言:javascript
复制
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)
}
代码语言:javascript
复制
Error :

./prodsum.go:16:14: cannot range over prods (type interface {})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-07 04:56:14

使用类型断言类型开关确定值是片还是整数。下面是如何使用类型开关实现此操作:

代码语言:javascript
复制
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")
    }
}

就这样说吧:

代码语言:javascript
复制
a := arr{5, 2, arr{7, -1}, 3, arr{6, arr{-13, 8}, 4}}
n := sum(a)

在操场上跑

票数 5
EN

Stack Overflow用户

发布于 2020-07-07 04:38:01

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

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

在围棋游乐场跑步

代码语言:javascript
复制
myArr := []interface{}{1, 2, []int{7, 8, 3}, 1, []interface{}{3, []interface{}{2, []int{4, 5}}, 6}}

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

ProdSum接受一个类型为interface{}的参数--它不是一个片段,所以您不能对它进行迭代。您希望参数具有一种类型的[]interface{} (空接口的切片):

代码语言:javascript
复制
func ProdSum(prods []interface{}, sum int, depth int) {
    for itr, prod := range prods {
         // prod has type: interface{}
    }
}

请记住,在从片中读取值并对其进行求和时,需要执行类型断言操作。您不能将interface{}添加到任何东西中,因为(在断言到int之前) Go不能将它识别为数字。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62768168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档