【问题标题】:Reflection on slice of pointers对指针切片的反思
【发布时间】:2019-04-25 15:42:24
【问题描述】:

我正在尝试在存储在接口中的结构上反映一片指针{}

我认为我做得很好,直到需要反省指向结构上的内容。 请看下面的例子

package main

import (
    "fmt"
    "reflect"
)

type teststruct struct {
    prop1 string
    prop2 string
}

func main() {   
    test := teststruct{"test", "12"}

    var container interface{}

    var testcontainer []*teststruct

    testcontainer = append(testcontainer, &test)

    container = testcontainer   

    rcontainer := reflect.ValueOf(container)
    fmt.Println(rcontainer.Kind())

    rtest := rcontainer.Index(0).Elem()
    fmt.Println(rtest)

    rteststruct := reflect.ValueOf(rtest)
    fmt.Println(rteststruct.Kind())

    typeOfT := rteststruct.Type()

    for i := 0; i < rteststruct.NumField(); i++ {
        f := rteststruct.Field(i)
        fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.String())
    } 
}

哪些结果

slice
{test 12}
struct
0: typ *reflect.rtype = <*reflect.rtype Value>
1: ptr unsafe.Pointer = <unsafe.Pointer Value>
2: flag reflect.flag = <reflect.flag Value>

我肯定在这里遗漏了什么,有人可以解释一下吗?

【问题讨论】:

    标签: pointers go reflection slice


    【解决方案1】:

    rtest := rcontainer.Index(0).Elem() 已经是值,所以当你这样做时:rteststruct := reflect.ValueOf(rtest),你实际上得到了一个reflect.Value,当然是一个struct

    用这个替换你的代码的结尾:

    typeOfT := rtest.Type()
    
    for i := 0; i < rtest.NumField(); i++ {
        f := rtest.Field(i)
        fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.String())
    }
    

    Playground

    【讨论】:

    • 感谢您的帮助,我现在明白了,我对 Elem() 的理解是错误的。
    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2021-01-18
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多