douling0053 2017-08-15 14:03
浏览 681
已采纳

在Golang类型断言中可以使用反射数组类型吗?

I need to check if interface{} is an array and create corresponding slice if it is. Unfortunately I do not know array length in advance.

For example:

import (
  "reflect"
)
func AnythingToSlice(a interface{}) []interface{} {
  rt := reflect.TypeOf(a)
  switch rt.Kind() {
  case reflect.Slice:
    slice, ok := a.([]interface{})
    if ok {
      return slice
    }
    // it works

  case reflect.Array:
    // return a[:]
    // it doesn't work: cannot slice a (type interface {})   
    //
    array, ok := a.([reflect.ValueOf(a).Len()]interface{})
    // :-((( non-constant array bound reflect.ValueOf(a).Len()
    if ok {
       return array[:]
    }

  }
  return []interface{}(a)
}
  • 写回答

1条回答 默认 最新

  • dongxiang3648 2017-08-15 15:14
    关注

    An explicit type is required in a type assertion. The type cannot be constructed through reflection.

    Unless the argument is a []interface{}, the slice or array must be copied to produce a []interface{}.

    Try this:

    func AnythingToSlice(a interface{}) []interface{} {
        v := reflect.ValueOf(a)
        switch v.Kind() {
        case reflect.Slice, reflect.Array:
            result := make([]interface{}, v.Len())
            for i := 0; i < v.Len(); i++ {
                result[i] = v.Index(i).Interface()
            }
            return result
        default:
            panic("not supported")
        }
    }
    

    https://play.golang.org/p/3bXxnHOK8_

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签)
  • ¥50 sft下载大文阻塞卡死
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失
  • ¥15 springboot+vue 集成keycloak sso到阿里云
  • ¥15 win7系统进入桌面过一秒后突然黑屏
  • ¥30 backtrader对于期货交易的现金和资产计算的问题