du5739 2014-08-03 08:09
浏览 9
已采纳

指针,数组和切片的结构值

I want to have a generic way which will always return the struct value no matter if it is provided as pointer, slice or array.

My approach towards this looks:

func main() {
    p := Person{}

    if value(p).Kind() != reflect.Struct {
        fmt.Printf("Error 1")
    }
    if value(&p).Kind() != reflect.Struct {
        fmt.Printf("Error 2")
    }   
    if value([]Person{p}).Kind() != reflect.Struct {
        fmt.Printf("Error 3")
    }
    if value(&[]Person{p}).Kind() != reflect.Struct {
        fmt.Printf("Error 4")
    }
}

func value(m interface{}) reflect.Value {
    v := reflect.ValueOf(m)

    switch v.Kind() {
    case reflect.Ptr:
        v = v.Elem()

        fallthrough
    case reflect.Slice, reflect.Array:
        v = v.Elem()
    }

    return v
}

Go Playground

As you can see the problem lays with in getting the struct out of a slice or array.

How do I need to extend the above function to get the struct value from with in an array or slice?

Update: What I want to do is turn []People into People.

  • 写回答

2条回答 默认 最新

  • dsbo44836129 2014-08-03 12:50
    关注

    If you just want the type even if the slice is nil, you can use something like this:

    func value(m interface{}) reflect.Type {
        t := reflect.Indirect(reflect.ValueOf(m)).Type()
        if t.Kind() == reflect.Slice || t.Kind() == reflect.Array {
            t = t.Elem()
            if t.Kind() == reflect.Ptr {
                t = t.Elem()
            }
            return t
    
        }
        return t
    }
    

    About Type.Elem(), from http://golang.org/pkg/reflect/#Type:

    // Elem returns a type's element type.

    // It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.

    //edit updated the function to work on a slice of pointers as well.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 three.js添加后处理以后模型锯齿化严重