我对此非常困惑,我知道:
func getKind(v interface{}) string {
rt := reflect.TypeOf(v)
switch rt.Kind() {
case reflect.Slice:
return "slice"
case reflect.Array:
return "array"
default:
return "unknown"
}
}
func FlattenDeep(args ...interface{}) []interface{} {
list := []interface{}{}
for _, v := range args {
kind := getKind(v)
if kind != "unknown" {
for _, z := range FlattenDeep((v.([]interface{}))...) { // FAILS HERE
list = append(list, z)
}
} else {
list = append(list, v);
}
}
return list;
}
错误是:
panic:接口转换:interface {}是[] func(http.HandlerFunc) http.HandlerFunc,而不是[] interface {}
我不明白,我认为可以将任何内容转换为接口{}
我认为我是通过以下方式解决了运行时错误:
for _, v := range args {
kind := getKind(v)
if kind != "unknown" {
a, ok := v.([]interface{})
if ok == false {
panic("o fuk")
}
for _, z := range FlattenDeep(a...) {
list = append(list, z)
}
} else {
list = append(list, v);
}
}
还是觉得不对,为什么要走?为什么
答案 0 :(得分:3)
类型不相同,如注释中所述。
由于某种原因,您尝试使用的运算符被称为“类型断言”,而不是“类型转换”。它不会以任何方式操纵基础数据。它只是断言可以将基础数据当作断言的类型来对待(并且在您使用的单一分配形式中,如果类型不正确,则会惊慌)。
我将跳过为何不起作用的解释,而直接回答以下问题
耶稣,我认为至少切片/阵列可能是通用的,我应该做大声笑
定义以下功能:
func toIfaceSlice(any interface{}) []interface{} {
var out []interface{}
rv := reflect.ValueOf(any)
for i := 0; i < rv.Len(); i++ {
out = append(out, rv.Index(i).Interface())
}
return out
}
并使用它来将v
转换为FlattenDeep
。
注意:为简便起见,我没有进行任何优化和错误检查。