package main
import (
"fmt"
"reflect"
)
//定义Monster结构体
type Monster struct{
Name string `json:"name"` //设置json tag
Age int `json:"monster_age"`
Score float64 `json:"score"`
Sex string
}
//给Monster绑定 GetSum方法
func (s Monster)GetSum(n1,n2 int)int{
return n1+n2
}
//给Monster绑定 Set方法
func (s Monster)Set(name string,age int,score float64,sex string){
s.Name = name
s.Age = age
s.Score = score
s.Sex = sex
}
//给Monster绑定 Print方法
func (s Monster)Print(){
fmt.Println("--start---")
fmt.Println(s)
fmt.Println("-- end ---")
}
//reflect测试
func TestStruct(a interface{}){
//获取reflect.Type类型 ==> 获取字段里的tag
typ := reflect.TypeOf(a).Elem()
fmt.Println(typ)
//获取reflect.Value类型
val := reflect.ValueOf(a).Elem()
fmt.Println(val)
//修改结构体字段里的值
val.Field(0).SetString("红孩儿")
fmt.Println("---------------------------------------")
//val := reflect.Indirect(val1)
//获取到reflect.Value.kind(类别),用作后面判断是否是结构体类别
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++{
//reflect.Value.Filed(i)
fmt.Printf("Filed %d:值=%v\n",i,val.Field(i))
//获取到tag标签的值
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)
//方法的排序默认是按照函数名的ASCII码排序的
val.Method(1).Call(nil) //Print()
//调用结构体的第1个方法
var paramters []reflect.Value //定义一个切片,作为Call的参数
paramters = append(paramters,reflect.ValueOf(10))
paramters = append(paramters,reflect.ValueOf(20))
res := val.Method(0).Call(paramters) //res是相应参数的返回值
fmt.Println("res=",res[0].Int())
}
func main(){
//创建一个 Monster实例
var a = &Monster{
Name : "黄鼠狼",
Age : 22,
Score : 88.5,
}
TestStruct(a)
}
Golang反射---结构体的操作案例大全
于 2022-03-08 20:58:22 首次发布