关于go:隐式转换失败应该成功吗?


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
}

去游乐场试试

在递归到FlattenDeep之前,使用它来转换v

Note: for brevity, I left out any optimizations and error checking.