簡體   English   中英

如何使用reflect讀取指向切片的指針的值?

[英]How do I read the value of a pointer to a slice using reflect?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM