🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> ### reflect * 类型信息, 元信息 预先定义好的 reflect.TypeOf * 值类型 程序运行过程中动态改变 reflect.ValueOf > ### 例子一 ~~~ package main import ( "fmt" "reflect" ) func typeJudgment(i interface{}) { reType := reflect.TypeOf(i) kind := reType.Kind() switch kind { case reflect.Int: fmt.Println("Int Type") case reflect.String: fmt.Println("String Type") case reflect.Slice: fmt.Println("Slice Type") case reflect.Ptr: fmt.Println("Ptr Type") } } func main() { number := 5 i := &number typeJudgment(i) } ~~~ > ### 例子2 ~~~ package main import ( "fmt" "reflect" ) type MessageBox struct { Name string `json:"JName" tag1:"TagName"` //tag是结构体的原信息, 可以在运行时通过反射的机制读取出来 title string `json:"JTitle" tag1:"TagTitle"` Age int `json:"JAge" tag1:"TagAge"` Content string `json:"JContent" tag1:"TagContent"` } func (box MessageBox) Tag(name string) { reType := reflect.TypeOf(box) num := reType.NumField() for i := 0; i < num; i++ { fmt.Println(reType.Field(i).Tag.Get(name)) } } func (box *MessageBox) reflectMsg() { reType := reflect.TypeOf(*box) reValue := reflect.ValueOf(*box) num := reType.NumField() for i := 0; i < num; i++ { fmt.Println(reType.Field(i), "---", reValue.Field(i)) } } func (box *MessageBox) reflectTag(name string) { reType := reflect.TypeOf(box).Elem() num := reType.NumField() for i := 0; i < num; i++ { fmt.Println(reType.Field(i).Tag.Get(name)) } } func (box *MessageBox) reflectMethod() { reValue := reflect.ValueOf(box).Elem() reMethod := reValue.MethodByName("Tag") //T类型的方法 args := []reflect.Value{reflect.ValueOf("json")} reMethod.Call(args) } func main() { mbox := MessageBox{Name: "张三", title: "Hi", Age: 18, Content: "Hello World"} fmt.Println("-----TODO1-----") mbox.reflectMsg() fmt.Println("-----TODO2-----") mbox.reflectTag("tag1") fmt.Println("-----TODO3-----") mbox.reflectMethod() } ~~~ 复制 > ### 相关阅读 * [反射](http://www.chairis.cn/blog/article/67)