为了账号安全,请及时绑定邮箱和手机立即绑定

迭代一个接口

迭代一个接口

Go
喵喵时光机 2021-08-16 18:31:46
我想创建一个函数,它接受一个映射或一个数组,并迭代它,在每个项目上调用一个函数,该函数知道如何处理遇到的任何类型。这是我第一次失败的尝试。目前,当我在实际用例中运行它时,它总是说“哦哦!”。func DoTheThingToAllTheThings(data_interface interface{}) int {    var numThings int    switch data := data_interface.(type) {    case map[interface{}]interface{}:        numThings = len(data)        for index, item := range data {            DoTheThing(index, item)    }    case []interface{}:        numThings = len(data)        for index, item := range data {            DoTheThing(index, item)        }    default:        fmt.Println("uh oh!")    }    return numThings}数组或映射可能包含许多不同的内容,因此尝试匹配每个可能的输入不是一个选项。换句话说,有没有办法在不确切知道它是什么的情况下迭代 Go 中的数组或映射?
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

为了让您的示例工作,您需要构建一个interface{}(或映射)数组,以便检测到正确的类型:


// This won't work, as the .(type) would be []S

someS := []S{S{}}

DoTheThingToAllTheThings(someS)


// This will: it will go in case []interface{}:

someSI := make([]interface{}, len(someS))

for i, s := range someS {

    someSI[i] = s

}

DoTheThingToAllTheThings(someSI)

在此处查看完整示例。


但这意味着您仍然可以interface{}在您的DoTheThing功能中使用。

这里没有真正的泛型,正如我在“ Go 中的泛型是什么? ”中提到的。


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号