Implicit conversion fails when it should succeed?
本问题已经有最佳答案,请猛点这里访问。
我对此非常困惑,我有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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 conversion: interface {} is []func(http.HandlerFunc)
http.HandlerFunc, not []interface {}
号
我不明白,我以为任何东西的一部分都可以转换成一部分接口
我想我通过这样做修复了运行时错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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); } } |
号
还是觉得不对劲,为什么要去?为什么
如注释中所述,类型不是等效的。
您试图使用的运算符被称为"类型断言",而不是"类型转换"。它不会以任何方式操纵底层数据。它只是断言可以将基础数据视为断言的类型(并且在您使用的单一赋值形式中,如果类型不正确,将导致死机)。
我将跳过对为什么这不起作用的解释,直接回答以下问题
Jesus, I thought at the very least slices/arrays could be generic, wtf am I supposed to do lol
号
定义以下功能:
1 2 3 4 5 6 7 8 | 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 } |
去游乐场试试
在递归到
Note: for brevity, I left out any optimizations and error checking.
号