package main
import (
"fmt"
"reflect"
)
type Monster struct{
Name string `json:"name"`
Age int `json:"monster_age"`
Score float64 `json:"score"`
Sex string
}
func (s Monster)GetSum(n1,n2 int)int{
return n1+n2
}
func (s Monster)Set(name string,age int,score float64,sex string){
s.Name = name
s.Age = age
s.Score = score
s.Sex = sex
}
func (s Monster)Print(){
fmt.Println("--start---")
fmt.Println(s)
fmt.Println("-- end ---")
}
func TestStruct(a interface{}){
typ := reflect.TypeOf(a).Elem()
fmt.Println(typ)
val := reflect.ValueOf(a).Elem()
fmt.Println(val)
val.Field(0).SetString("红孩儿")
fmt.Println("---------------------------------------")
kd := val.Kind()
fmt.Println(kd)
if kd != reflect.Struct{
fmt.Println("expect struct")
return
}
numField := val.NumField()
fmt.Println(numField)
for i:=0;i<numField;i++{
fmt.Printf("Filed %d:值=%v\n",i,val.Field(i))
tagVal := typ.Field(i).Tag.Get("json")
if tagVal != ""{
fmt.Printf("Filed %d:tag=%v\n",i,tagVal)
}
}
fmt.Println("-----------------------------------------------")
numMethod := val.NumMethod()
fmt.Printf("struct has %d methods\n",numMethod)
val.Method(1).Call(nil)
var paramters []reflect.Value
paramters = append(paramters,reflect.ValueOf(10))
paramters = append(paramters,reflect.ValueOf(20))
res := val.Method(0).Call(paramters)
fmt.Println("res=",res[0].Int())
}
func main(){
var a = &Monster{
Name : "黄鼠狼",
Age : 22,
Score : 88.5,
}
TestStruct(a)
}
