reflect.TypeOf
// reflect.TypeOf 像是键值对里的key 可以获得对应的属性key值
package mainimport ( "reflect" "fmt")// 反射type fs struct { Name string Age int}func (f fs) Common() { f.Name = "deflyl" f.Age = 0 fmt.Println(f.Name,f.Age)}func (f fs) GetName() string { fmt.Println(f.Name) return f.Name}func (f *fs) GetInfo() { fmt.Println("name=", f.Name, "age=", f.Age)}func (f fs) GetAge() int { return f.Age}func main() { // reflect.TypeOf 像是键值对里的key 可以获得对应的属性key值 // 获得变量类型信息 var l fs = fs{"lyl", 20} k := reflect.TypeOf(l) fmt.Println(k) fmt.Println(k.NumField()) // 输出 结构 变量-数量 //2 fmt.Println(k.Field(1).Name) // 输出 结构第二个变量 Age //Age fmt.Println(k.NumMethod()) // 输出结构的方法 数量 //2"debug/elf" fmt.Println(k.Method(0)) // 输出结构第一个方法 //{GetAge func(main.fs) int0} // reflect.ValueOf 像是键值对里的value 可以获得对应的value值 // 获得对象实例信息 v := reflect.ValueOf(l) fmt.Println("reflect.ValueOf = ", v) ret := reflect.Indirect(v) fmt.Println("ret=", ret) fmt.Println("ret->type=", ret.Type()) fmt.Println(v.NumField()) // 输出2 fmt.Println(v.Field(1)) // 输出结构第二个变量的 看的值 fmt.Println(v.NumMethod()) // 输出方法数量 fmt.Println(v.Method(0)) // 输出方法地址 // 基于实例指针 调用他的实例函数 el := fs{"lx", 18} elm := reflect.ValueOf(&el) // 指针 可以调用结构的指针函数 elem := elm.Elem() // 获取类型 例如 这里获取的是 fs{} 不是 &fs{} fmt.Println(elm.Type()) // 指针 fmt.Println(elem.Type()) // 获取类型 elem.MethodByName("GetName").Call(nil) // 调用结构函数 elm.MethodByName("GetInfo").Call(nil) // 调用结构指针函数 // 通过反射来创建相应结构 // 通过反射来创建相应结构 var new_obj = reflect.New(ret.Type()) fmt.Println("通过反射来创建相应结构", new_obj) fmt.Println("通过反射来创建相应结构调用common", new_obj.MethodByName("Common").Call(nil))}
package testfuncimport( "fmt")type Test struct{ Name string Age int}/*type Intio interface { Stringtest() string}*/func (this Test) Stringtest(){ fmt.Println(this.Name)}func (this Test) Stringtest2(){ fmt.Println("Stringtest2",this.Name)}func (this *Test) Stringtest1(i int){ this.Age=i fmt.Println(this.Age)}func GetNumArgs(args []string,num int) string{ if num==0 { num=1 } return args[num]}
package mainimport( "testfunc" "reflect" "fmt")func main(){ d:=&testfunc.Test{"lyl",18} v:=reflect.ValueOf(d) ele:=v.Elem() t:=ele.Type() //读取这个对象的所有属性 fmt.Println("读取这个对象的所有属性") for i:=0;i
//通过 结构的type通过映射新建
package mainimport ( "reflect" "fmt")type index struct{ A string B string}func(i *index)Indexset(){ i.A="setA" i.B="setB"}func main(){ i:=&index{"A1","B1"} tv:=reflect.ValueOf(i) fmt.Println(tv) //&{}指向 tt:=reflect.Indirect(tv).Type()//获得类型 fmt.Println(tt)//输出main.index tnew:=reflect.New(tt)//通过类型创建一个新的type tnewv:=tnew.MethodByName("Indexset") tnewv.Call(nil) fmt.Println(i) //&{A1 B1} fmt.Println(tnew)//&{setA setB}}
//通过reflect.new获得 type使用interface()方法.(interface)转换成结构,使用接口调用方法
package mainimport ( "reflect" "fmt")type Iindex interface { Indexset()}type index struct{ A string B string}func(i *index)Indexset(){ i.A="setA" i.B="setB"}func main(){ i:=&index{"A1","B1"} tv:=reflect.ValueOf(i) fmt.Println(tv) //&{}指向 tt:=reflect.Indirect(tv).Type()//获得类型 fmt.Println(tt)//输出main.index tnew:=reflect.New(tt)//通过类型创建一个新的type tinterface:=tnew.Interface().(Iindex) tinterface.Indexset() fmt.Println(i) //&{A1 B1} fmt.Println(tnew)//&{setA setB}}