我想创建一个函数,它接受一个映射或一个数组,并迭代它,在每个项目上调用一个函数,该函数知道如何处理遇到的任何类型。这是我第一次失败的尝试。目前,当我在实际用例中运行它时,它总是说“哦哦!”。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 中的泛型是什么? ”中提到的。
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消