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;
}
错误是:
恐慌:接口转换:接口 {} 是 []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);
}
}
还是觉得不对劲,为什么要去?为什么
解决方案
如评论中所述,类型不等效。
出于某种原因,您尝试使用的运算符称为“类型断言”而不是“类型转换”。它不会以任何方式操纵基础数据。它只是断言可以将基础数据视为断言类型(并且在您使用的单一赋值形式中,如果类型不正确,则会出现恐慌)。
我将跳过为什么这不起作用的解释并直接回答以下问题
耶稣,我认为至少切片/数组可能是通用的,我应该这样做吗哈哈
定义以下函数:
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
.
注意:为简洁起见,我省略了任何优化和错误检查。
推荐阅读
- linux - 使用 shell 脚本和 awk 格式化然后将 txt 转换为 csv
- azure - 是否可以将 Azure 数据工厂配置为在 Azure Batch 中启用容器的池中运行自定义活动?
- excel - 根据单元格值将excel工作表保存到文件夹和文件名
- android - 如何在点击时溶解 MAPBOX 中的集群?
- unity3d - 如何在unity3d中更改画布的大小
- backend - 有没有办法使用 Knex 来拥有一列数组?
- angularjs - 离子选择动态
- sql - 表值参数“不能将参数 @Queues 声明为只读,因为它不是表值参数”
- css - CSS Grid align-items:基线在 Safari 中不起作用
- regex - 多个正则表达式查询(记事本++)