簡體   English   中英

使用反射獲取結構字段的指針值

[英]Get value of pointer of a struct field using reflect

package main

import (
    "fmt"
    "reflect"
)

type PetDetails struct {
    Name *string
}

type Student struct {
    Fname  string
    Lname  string
    City   string
    Mobile *int
    Pet *PetDetails
}

func main() {
    i := 7777777777
    petName := "Groot"
    s := Student{"Chetan", "Tulsyan", "Bangalore", &i, &PetDetails{&petName}}
    v := reflect.ValueOf(s)
    typeOfS := v.Type()
    
    for i := 0; i< v.NumField(); i++ {
        fmt.Printf("Field: %s\tValue: %v\n", typeOfS.Field(i).Name, v.Field(i).Interface())
    }
}

我正在嘗試將這些結構轉換為 map[string]string,因為我需要用於 mongoDB 更新查詢的映射。 將我的結構轉換為 BSON 后,它不是查詢 { "pet.name": "Groot" } 而是 { "pet": { "name": "Groot" } } ,它刪除了嵌入文檔 pet 中的其他字段。 我不確定如何覆蓋 BSON marshals,因為我使用的是 mongodb 驅動程序,而不是 mgo

我想獲取移動指針的值和寵物的名稱,但我得到的只是地址

我如何獲得價值,例如 7777 和 Groot ? 謝謝

您可以使用Elem取消引用指針類型。

x := 5
ptr := reflect.ValueOf(&x)
value := ptr.Elem()

ptr.Type().Name() // *int
ptr.Type().Kind() // reflect.Ptr
ptr.Interface()   // [pointer to x]
ptr.Set(4)        // panic

value.Type().Name() // int
value.Type().Kind() // reflect.Int
value.Interface()   // 5
value.Set(4)        // this works

例如,要檢索示例中的手機號碼,您應該將 main 中的循環更改為:

for i := 0; i < v.NumField(); i++ {
    field := v.Field(i)
    value := field.Interface()

    // If a pointer type dereference with Elem
    if field.Kind() == reflect.Ptr {
        value = field.Elem().Interface()
    }

    fmt.Printf("Field: %s\tValue: %v\n", typeOfS.Field(i).Name, value)
}

暫無
暫無

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

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