首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当值为reflect.Ptr类型时,如何使用reflect.FieldByName

当值为reflect.Ptr类型时,如何使用reflect.FieldByName
EN

Stack Overflow用户
提问于 2018-07-23 07:41:42
回答 1查看 548关注 0票数 0

我有一个project函数,它按输入切片中每个结构或映射的名称返回一个切片,其中包含字段值。在输入切片包含指向结构的指针的情况下,我遇到了问题。我设置了一个递归函数来对值进行操作,但是需要知道如何从种类reflect.Ptr转换为底层的reflect.Struct。这是怎么做的?任何其他的设计建议都是值得感谢的。我还是个新手。

代码如下:

代码语言:javascript
复制
func project(in []interface{}, property string) []interface{} {

    var result []interface{}

    var appendValue func(list []interface{}, el interface{})

    appendValue = func(list []interface{}, el interface{}) {
        v := reflect.ValueOf(el)
        kind := v.Kind()
        if kind == reflect.Ptr {

            // How do I get the struct behind this ptr?
            // appendValue(list, el)

        } else if kind == reflect.Struct {
            result = append(result, v.FieldByName(property).Interface())
        } else if kind == reflect.Map {
            result = append(result, el.(map[string]interface{})[property])
        } else {
            panic("Value must be a struct or map")
        }
    }

    for _, el := range in {
        appendValue(result, el)
    }

    return result

}

..。测试用例:

代码语言:javascript
复制
func Test_project(t *testing.T) {

    cases := map[string]struct {
        input    []interface{}
        property string
        expected []interface{}
    }{
        "simple-map": {
            []interface{}{
                map[string]interface{}{
                    "a": "a1",
                },
            },
            "a",
            []interface{}{"a1"},
        },
        "simple-struct": {
            []interface{}{
                simpleStruct{
                    A: "a1",
                },
            },
            "A",
            []interface{}{"a1"},
        },
        // THIS ONE FAILS
        "simple-struct-ptr": {
            []interface{}{
                &simpleStruct{
                    A: "a1",
                },
            },
            "A",
            []interface{}{"a1"},
        },
    }

    for k, v := range cases {

        t.Run(k, func(t *testing.T) {
            got := project(v.input, v.property)
            if !reflect.DeepEqual(got, v.expected) {
                t.Fatalf("Expected %+v, got %+v", v.expected, got)
            }
        })
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-07-23 07:45:19

使用Elem()reflect.Ptr转到它所指向的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51470090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档