duanjiao3686 2015-08-10 16:03
浏览 10
已采纳

在Go中获取空结构片的字段

I have a function

func (r *render) foo(v interface{}) {
    val := reflect.ValueOf(v)
    fields := structs.Fields(val.Index(0).Interface())

...

Which takes a slice of structs and tries to get the fields of v, however if v is empty then "val.Index(0)" crashes the program. Is there a better way to do this?

  • 写回答

1条回答 默认 最新

  • doupang3062 2015-08-10 16:10
    关注

    You need to check first if you have a slice to begin with, then check if you have an empty slice, and you probably should check that you have a struct too while you're at it: (example)

    val := reflect.ValueOf(v)
    if val.Kind() != reflect.Slice {
        fmt.Println("not a slice")
        return
    }
    
    if val.Len() == 0 {
        fmt.Println("empty slice")
        return
    }
    
    if val.Index(0).Kind() != reflect.Struct {
        fmt.Println("not a slice of structs")
        return
    }
    
    fields := structs.Fields(val.Index(0).Interface())
    ...
    

    If you only want the fields from a struct type, regardless of if the slice is empty, you can use the slice type's Elem method to extract it (example)

    // get the internal type of the slice
    t := val.Type().Elem()
    if t.Kind() != reflect.Struct {
        fmt.Println("not a struct")
        return
    }
    
    fmt.Println("Type:", t)
    for i := 0; i < t.NumField(); i++ {
        fmt.Println(t.Field(i).Name)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题