package main
import (
"fmt"
"reflect"
)
type Monster struct{
Name string `json:"Name"`
Age int `json:"monster_age"`
Score float32
Sex string
}
//显示s的值
func (s Monster) Print(){
fmt.Println("---start---")
fmt.Println(s)
fmt.Println("---end---")
}
//返回两个数的和
func (s Monster) GetSum(n1,n2 int) int {
return n1+n2
}
//设置s结构体的在
func (s Monster) 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{}){
//获取reflect.Type类型
typ := reflect.TypeOf(a)
//获取reflect.Value类型
val := reflect.ValueOf(a)
//获取a对应的类别
kd := val.Kind()
//判断
if kd != reflect.Struct{
fmt.Println("expect struct")
return
}
num := val.NumField()
fmt.Printf("结构体中有 %d 个字段\n",num)
for i := 0;i<num;i++{
fmt.Printf("字段 %d: 值为=%v ",i,val.Field(i))
//获取到struct标签,注意需通过reflect.Type来获取tag标签值
tagVal := typ.Field(i).Tag.Get("json")
if tagVal !=""{
fmt.Printf("字段%d: tag 为=%v",i,tagVal )
}
fmt.Println()
}
//获取到该结构体有多少个方法
numOfMethod := val.NumMethod()
fmt.Printf("结构体有 %d 个方法\n",numOfMethod)
//var params []reflect.Value
val.Method(1).Call(nil)//函数的排序是按照函数名(ASCII)排序
//调用结构体的第1个方法Method(0)
var params []reflect.Value
params = append(params,reflect.ValueOf(10))
params = append(params,reflect.ValueOf(40))
res := val.Method(0).Call(params)//传入参数是[]reflect.Value,返回[]reflect
fmt.Println("res=",res[0].Int())//返回结果,返回结果是[]reflect.Value
}
func main() {
var a Monster = Monster{
"黄鼠狼",
300,
77,
"man",
}
TestStruct(a)
}