隐式转换应该何时成功失败?

时间:2018-12-21 02:18:38

标签: go

我对此非常困惑,我知道:

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);
    }
}

还是觉得不对,为什么要走?为什么

1 个答案:

答案 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
}

Try on the Go Playground

并使用它来将v转换为FlattenDeep

  

注意:为简便起见,我没有进行任何优化和错误检查。