2 回答
TA贡献1827条经验 获得超4个赞
您的示例不是惯用的 Go 代码,尽管惯用的代码在词汇上似乎也违反了 DRY 原则。
理解的关键点是 'x'在每种类型的情况下都是一个单独的、不同类型的变量:
function(someArr interface{}){
switch x := someArr.(type) {
case []int:
for i := range x {
// CODE
}
case []string:
for i := range x {
// CODE
}
}
}
TA贡献1789条经验 获得超10个赞
您可以使用反射包来迭代任意切片。但是[]int显式地实现特殊情况(如)通常更快,并且通常除了避免在常见情况下的反射之外还这样做。
package main
import "fmt"
import "reflect"
func foo(values interface{}) {
rv := reflect.ValueOf(values)
if rv.Kind() != reflect.Slice {
return
}
n := rv.Len()
for i := 0; i < n; i++ {
value := rv.Index(i).Interface()
fmt.Println(value)
}
}
func main() {
foo([]int{1, 3, 3, 7})
}
编辑:我不确定为什么有人对这个问题和我的答案投了反对票,但在某些情况下,您需要处理这样的代码。甚至标准库也包含很多,例如“fmt”、“gob”、“json”、“xml”和“template”。提问者可能面临类似的问题。
- 2 回答
- 0 关注
- 167 浏览
添加回答
举报