登录
首页 >  Golang >  Go问答

读取切片指针指向的值的反射方法

来源:stackoverflow

时间:2024-02-27 09:27:28 470浏览 收藏

golang学习网今天将给大家带来《读取切片指针指向的值的反射方法》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

package main

import (
    "fmt"
    "reflect"
)

func main() {

    type tu struct {
        N int
    }

    type t struct {
        ARRAY []tu
        NESTED *tu
        NESTED_ARRAY []*tu
    }

    var n = t{[]tu{{4}}, &tu{5}, []*tu{{6}}}

    //print value
    fmt.Printf("value2: %v\n", reflect.ValueOf(&n).Elem().Field(1).Slice(0, 1))
    fmt.Printf("value3: %v\n", reflect.ValueOf(&n).Elem().Field(2).Elem().Field(0))
    fmt.Printf("value4: %v\n", reflect.ValueOf(&n).Elem().Field(3).Slice(0, 1).Elem().Field(0))

    return
}

我正在尝试使用反射访问切片指针的值。

reflect.valueof(&n).elem().field(3).slice(0, 1).elem().field(0) 应该可以工作,但不能。

我应该如何解决这个问题?


解决方案


字段索引以 0 开头,而不是 1。因此将所有索引减少 1。

在最后一个示例中,Value.Slice() 调用返回一个切片,而不是指针(不是切片的元素,而是子切片)。如果您需要一个元素,请拨打 Value.Index(),然后您可以拨打 Elem()Field()

fmt.printf("value2: %v\n", reflect.valueof(&n).elem().field(0).slice(0, 1))
fmt.printf("value3: %v\n", reflect.valueof(&n).elem().field(1).elem().field(0))
fmt.printf("value4: %v\n", reflect.valueof(&n).elem().field(2).slice(0, 1).index(0).elem().field(0))

这将输出(在 Go Playground 上尝试):

value2: [{4}]
value3: 5
value4: 6

另请注意,Value.Slice() 方法相当于切片表达式。如果需要元素,只需调用value.index()即可,不需要slice()方法:

fmt.printf("value2: %v\n", reflect.valueof(&n).elem().field(0).index(0))
fmt.printf("value3: %v\n", reflect.valueof(&n).elem().field(1).elem().field(0))
fmt.printf("value4: %v\n", reflect.valueof(&n).elem().field(2).index(0).elem().field(0))

这将输出(在 Go Playground 上尝试这个):

value2: {4}
value3: 5
value4: 6

以上就是《读取切片指针指向的值的反射方法》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>