package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string `json:"name"`
Age int `json:"p_age"`
Score float32
Sex string
}
func (s Person) Print() {
fmt.Println("----start----")
fmt.Println(s)
fmt.Println("----end----")
}
func (s Person) GetSum(n1, n2 int) int {
return n1 + n2
}
func (s Person) Set(name string, age int, score float32, sex string) {
s.Name = name
s.Age = age
s.Score = score
s.Sex = sex
}
func TestStruct(a interface{}) {
typ := reflect.TypeOf(a)
val := reflect.ValueOf(a)
kd := val.Kind()
if kd != reflect.Struct {
fmt.Println("expect struct")
return
}
num := val.NumField()
fmt.Printf("struct has %d fields\n", num)
for i := 0; i< num; i++ {
fmt.Printf("field %d: 值为=%v\n", i, val.Field(i))
//获取到struct标签,注意需要使用reflect.Type获取tag标签的值
tagVal := typ.Field(i).Tag.Get("json")
if tagVal != "" {
fmt.Printf("field %d: tag为=%v\n", i, tagVal)
}
}
numOfMethod := val.NumMethod()
fmt.Printf("struct has %d methods\n", numOfMethod)
val.Method(1).Call(nil)
var params []reflect.Value
params = append(params, reflect.ValueOf(10))
params = append(params, reflect.ValueOf(40))
//传入的参数是[]reflect.Value
res := val.Method(0).Call(params)
//返回结果是[]reflect.Value
fmt.Println("res=", res[0].Int())
}
func main() {
var a = Person{
Name: "Demon",
Age: 10,
Score: 20,
Sex: "male",
}
TestStruct(a)
}
使用反射遍历结构体的字段,调用结构体的方法,并获取结构体标签的值
最新推荐文章于 2024-04-26 20:49:58 发布