以前用Java开发的时候,尤其是接触到略微底层一点的货色,比方AOP,动静代理这些货色,都要用到反射,当初学习go语言,发射这些反射和Java外面的及其相似,不过也有差别,以下是一些代码演示
根本数据类型的反射
package main//反射,根本数据类型import ( "fmt" "reflect")type myInt inttype Person struct { Name string Age int}func reflectType(v interface{}) { typeOf := reflect.TypeOf(v) name := typeOf.Name() kind := typeOf.Kind() fmt.Printf("【typeof】: %v, 【Name】: %v, 【Kind】: %v\n", typeOf, name, kind)}func reflectValue(v interface{}) { val := reflect.ValueOf(v) kind := val.Kind() fmt.Println("原始类型:", kind) switch kind { case reflect.Int: fmt.Println(val.Int()) case reflect.String: fmt.Println(val.String()) case reflect.Float32: fmt.Println(val.Float()) default: fmt.Println("还没有去判断这个类型") }}func resetValue(v interface{}) { val := reflect.ValueOf(v) kind := val.Kind() //如果传入的参数不是指针类型,那么就不能对其原始的变量进行赋值 //然而如果传入的参数是指针类型,通过val.Kind()办法获取到的是ptr类型 //如果想要判断是int,则须要应用val.Elem().Kind()办法 fmt.Println(kind) k := val.Elem().Kind() fmt.Println("理论类型:", k) if k == reflect.Int64 { val.Elem().SetInt(2323) } else if k == reflect.String { val.Elem().SetString("hello golang") } else { fmt.Println("临时没设置这种类型") }}func main() { a := 10 b := 12.3 c := true d := "nihao" var e myInt = 12 f := Person{ Name: "nihao", Age: 12, } g := [3]int{0, 1, 2} h := []int{4, 5} var i = &a reflectType(a) reflectType(b) reflectType(c) reflectType(d) reflectType(e) reflectType(f) reflectType(g) reflectType(h) reflectType(i) reflectValue(23) reflectValue("string") var aint = 12 resetValue(&aint) fmt.Println(aint)}
构造体的反射
package mainimport ( "fmt" "reflect")//反射,构造体type Person struct { Name string `json:"name"` Age int `json:"age"` Address string}func (p Person) GetInfo() string { return fmt.Sprintf("Name:%v,Age:%v,Address:%v", p.Name, p.Age, p.Address)}func (p *Person) SetInfo(name string, age int, address string) { p.Name = name p.Age = age p.Address = address}func main() { var p = Person{ Name: "silk", Age: 20, Address: "苏州", } t := reflect.TypeOf(p) if t.Kind() != reflect.Struct && t.Elem().Kind() != reflect.Struct { fmt.Println("传入的类型不是构造体") } field := t.Field(0) fmt.Println(field.Name) fmt.Println(field.Type) fmt.Println(field.Tag.Get("json")) name, ok := t.FieldByName("Age") if ok { fmt.Println(name.Name) fmt.Println(name.Type) fmt.Println(name.Tag.Get("json")) } for i := 0; i < t.NumField(); i++ { fmt.Printf("name:%v,type:%v,tag:%v\n", t.Field(i).Name, t.Field(i).Type, t.Field(i).Tag.Get("json")) } method := t.NumMethod() fmt.Println("methodcount:", method) for i := 0; i < method; i++ { fmt.Println(t.Method(i).Name) } //留神,当应用SetInfo办法时候,传入的必须是指针类型,否则会报错 val := reflect.ValueOf(&p) call := val.MethodByName("GetInfo").Call(nil) fmt.Println(call) var params []reflect.Value params = append(params, reflect.ValueOf("java0904")) params = append(params, reflect.ValueOf(23)) params = append(params, reflect.ValueOf("苏州市工业园区")) val.MethodByName("SetInfo").Call(params) call = val.MethodByName("GetInfo").Call(nil) fmt.Println(call) fmt.Println(p)}
原文链接:https://www.sdk.cn/details/m1RMx6MZwxVWbYwWQo
SDK社区是一个中立的社区,这里有多样的前端常识,有丰盛的api,有爱学习的人工智能开发者,有有趣风趣的开发者带你学python,还有将来炽热的鸿蒙,当各种元素组合在一起,让咱们一起脑洞大开独特打造业余、好玩、有价值的开发者社区,帮忙开发者实现自我价值!