首页 > 解决方案 > 隐式转换在应该成功时失败?

问题描述

我对此感到非常困惑,我有:

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;

}

错误是:

恐慌:接口转换:接口 {} 是 []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);
    }
}

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

标签: go

解决方案


如评论中所述,类型不等效。

出于某种原因,您尝试使用的运算符称为“类型断言”而不是“类型转换”。它不会以任何方式操纵基础数据。它只是断言可以将基础数据视为断言类型(并且在您使用的单一赋值形式中,如果类型不正确,则会出现恐慌)。

我将跳过为什么这不起作用的解释并直接回答以下问题

耶稣,我认为至少切片/数组可能是通用的,我应该这样做吗哈哈

定义以下函数:

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
}

在 Go Playground 上尝试

v在递归成FlattenDeep.

注意:为简洁起见,我省略了任何优化和错误检查。


推荐阅读