【问题标题】:Dynamically Access Nested struct values [closed]动态访问嵌套结构值 [关闭]
【发布时间】:2021-07-22 21:17:56
【问题描述】:

我正在尝试根据从数据库中获取的路径访问属性:

例如在 struct Vehicle 中,


type Vehicle struct {
    core.Model
    Manufacturer Manufacturer
    VehicleNumber string
.....
}

type Manufacturer struct {
    ManufacturerName string
....
}

我想获取

value := exportValueFromField(vehicle,"Manufacturer.ManufacturerName")
    func exportValueFromField(data interface{}, index string) string {
       indexArray := strings.Split(index, ".")
       r := reflect.ValueOf(data)
       for _, i := range indexArray {
          if r.FieldByName(i).Kind() == reflect.Struct {
            r = reflect.ValueOf(r.FieldByName(i).Interface())
          }else {
            r = r.FieldByName(i)
          }
       }
       return fmt.Sprintf("%v", r)
   }

但它似乎不起作用

【问题讨论】:

  • 您能否详细说明“它似乎不起作用”?您看到什么错误或其他意外行为?
  • 当它只是一个级别时,例如 exportValueFromField(vehicle,"VehicleNumber") 它可以工作。
  • 但是当它是 exportValueFromField(vehicle,"Manufacturer.ManufacturerName") 它只返回空字符串
  • 我试过你的方法,对我有用
  • 确保该字段实际上不是空字符串

标签: go reflection


【解决方案1】:

这段代码只是对你尝试过的内容的回顾,它可以工作

package main

import (
    "fmt"
    "reflect"
    "strings"
)

type Vehicle struct {
    Manufacturer  Manufacturer
    VehicleNumber string
}

type Manufacturer struct {
    ManufacturerName string
}

func exportValueFromField(data interface{}, index string) string {
    indexArray := strings.Split(index, ".")
    r := reflect.ValueOf(data)
    for _, i := range indexArray {
        if r.FieldByName(i).Kind() == reflect.Struct {
            r = reflect.ValueOf(r.FieldByName(i).Interface())
        } else {
            r = r.FieldByName(i)
        }
    }
    return fmt.Sprintf("%v", r)
}

func main() {

    var vehicle = Vehicle{
        Manufacturer: Manufacturer{
            ManufacturerName: "hello",
        },
    }

    value := exportValueFromField(vehicle, "Manufacturer.ManufacturerName")
    fmt.Println(value)
}

【讨论】:

  • 这真的很奇怪。
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多