package main
import (
"fmt"
"reflect"
)
type Monster struct{
Name string `json:"name"`
Age int `json:"age"`
Score float32
Sex string
}
func (s Monster)Print(){
fmt.Println("------start-------")
fmt.Println(s)
fmt.Println("------end-------")
}
func (s Monster)GetSum(n1, n2 int) int {
return n1 + n2
}
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{}){
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 field\n", num)
for i := 0; i < num; i++ {
fmt.Printf("flied %d 值: %v \n", i , val.Field(i))
fmt.Printf("flied %d 值: %v \n", i , typ.Field(i))
tagVal := typ.Field(i).Tag.Get("json")
if tagVal != "" {
fmt.Printf("filed %d : tag 为 %v \n",i, tagVal)
}
}
numOfmethod := val.NumMethod()
fmt.Printf("struct has %d method \n ", numOfmethod)
val.Method(1).Call(nil)
//Call 需要传入切片
var params []reflect.Value
params = append(params, reflect.ValueOf(6))
params = append(params, reflect.ValueOf(7))
res := val.Method(0).Call(params)
fmt.Println(res[0].Int())
}
func main() {
a := Monster{
Name: "德玛",
Age: 20,
Score: 10,
Sex: "男",
}
TestStruct(a)
}
golang 反射机制
最新推荐文章于 2024-05-18 10:50:47 发布