小编典典

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

go

我想有一个通用的方法,无论它是作为指针,切片还是数组提供的,都将始终返回结构值。

我对此的处理方式如下:

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
}

去游乐场

如您所见,问题出在从a slicearray。中获取结构。

我如何扩展上面的函数以从数组或切片中获取struct的值?

更新:我要做的就是将[]People变成People


阅读 219

收藏
2020-07-02

共1个答案

小编典典

如果你只是想要的类型,即使片是零,你可以使用像这样

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
}

关于Type.Elem(),来自http://golang.org/pkg/reflect/#Type

// Elem返回类型的元素类型。

//如果类型的Kind不是Array,Chan,Map,Ptr或Slice,则会出现恐慌。

// 编辑 更新了该函数,使其也适用于切片指针。

2020-07-02