如何解决使用反射访问结构中的结构字段
我有以下内容:
package main
import (
"fmt"
"reflect"
)
type Model struct {
A AStruct `br:"peg"`
}
type AStruct struct {
ID string
}
type IModel interface {
}
func main() {
m := Model{AStruct{ID:"123"}}
var i IModel;
i = m
v := reflect.Indirect(reflect.ValueOf(m))
for i := 0; i < v.NumField(); i++ {
tag := v.Type().Field(i).Tag.Get("br")
if tag == "peg" {
fieldVal := v.Field(i)
fmt.Println("fieldVal.Kind():",fieldVal.Kind())
// How do I get it to work with FieldByName("ID") and print 123 once I know the tag has a value "peg"?
}
}
fmt.Println("i is",i)
}
我想使用reflect
打印“ 123”,但我无法使用。
编辑:
我实际上是在遍历以查找特定标签。所以我不想做v.FieldByName("A") directly. But I can do FieldByName("ID") once I get a handle of
A`。
编辑2 : 更改代码以包含标签。
解决方法
简单
fmt.Println("field value",v.FieldByName("A").FieldByName("ID"))
可以,请在Go Playground上尝试。
v
是一个reflect.Value
,包装了类型为Model
的值,该值具有一个结构域A
的sturct字段ID
。
编辑:
如果要按标签查找字段,请参见以下答案:What are the use(s) for tags in Go?
对于您问题中的代码,现在看起来像这样:
v := reflect.Indirect(reflect.ValueOf(i))
t := v.Type()
for i := 0; i < v.NumField(); i++ {
fieldVal := v.Field(i)
fmt.Println("fieldVal.Kind():",fieldVal.Kind())
if t.Field(i).Tag.Get("br") == "peg" {
fmt.Println("\thas tag: gr=peg")
fmt.Printf("\tfield value: %+v\n",fieldVal)
fmt.Println("\tID field value:",fieldVal.FieldByName("ID"))
}
}
输出(在Go Playground上尝试):
fieldVal.Kind(): struct
has tag: gr=peg
field value: {ID:123}
ID field value: 123
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。