golang通过反射获取结构中所有以t_开头的jsontag字段获取的字段是一个数组结构的我们要取每个数组结构里面的字段名字为value字段的值
下面是一个示例程序,可以实现这个功能:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
T_Fruits []Fruit `json:"t_fruits"`
T_Hobbies []Hobby `json:"t_hobbies"`
}
type Fruit struct {
Name string `json:"name"`
Color string `json:"color"`
Value int `json:"value"`
}
type Hobby struct {
Name string `json:"name"`
Type string `json:"type"`
Value int `json:"value"`
}
func main() {
p := Person{
Name: "Alice",
Age: 30,
T_Fruits: []Fruit{
{Name: "Apple", Color: "Red", Value: 10},
{Name: "Banana", Color: "Yellow", Value: 20},
},
T_Hobbies: []Hobby{
{Name: "Reading", Type: "Indoor", Value: 5},
{Name: "Hiking", Type: "Outdoor", Value: 8},
},
}
t := reflect.TypeOf(p)
v := reflect.ValueOf(p)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
tag := field.Tag.Get("json")
if tag != "" && tag[0:2] == "t_" {
subfield := v.Field(i)
if subfield.Kind() == reflect.Slice {
for j := 0; j < subfield.Len(); j++ {
subitem := subfield.Index(j)
value := subitem.FieldByName("Value").Int()
fmt.Printf("%s[%d].Value = %d\n", tag, j, value)
}
}
}
}
}
这个程序定义了一个Person结构体,包含若干个以t_开头的数组类型的字段,以及每个数组结构里面的value字段。
程序通过反射获取Person结构体的类型和值,并遍历每一个字段,检查其json tag是否以t_开头。如果是,就获取该字段对应的值,并遍历数组里面的每个元素,取出其中的value字段的值。最后打印出所有的value值。
输出结果如下:
t_fruits[0].Value = 10
t_fruits[1].Value = 20
t_hobbies[0].Value = 5
t_hobbies[1].Value = 8
``
原文地址: http://www.cveoy.top/t/topic/eQUv 著作权归作者所有。请勿转载和采集!