Golang反射

Golang反射,第1张

概述      为了验证go语言的反射机制,特谢了以下demo,基本涵盖了go反射的各种用法,由于代码都有注释,我就不分开解说了。 package mainimport ( "fmt" "reflect")type person struct { Name string `json:name` Age int `json:age`}func (this person)G

为了验证go语言的反射机制,特谢了以下demo,基本涵盖了go反射的各种用法,由于代码都有注释,我就不分开解说了。

package mainimport (	"fmt"	"reflect")type person struct {	name string `Json:name`	Age int     `Json:age`}func (this person)Getname() string{	fmt.Println("Call GetPerson")	return this.name}func (this person)GetAge() int{	fmt.Println("Call GetAge")	return this.Age}type alis_person persontype myint intfunc main(){	var pers *person = &person{name:"yunhai",Age:23}	t := reflect.TypeOf(pers)	v := reflect.ValueOf(pers)	t2 := v.Type()	t3 := v.Elem().Type()	if (t == t2){		fmt.Println("true") // true	}	fmt.Println(t)       // *main.person	fmt.Println(v)       // &{yunhai 23}	fmt.Println(t2)      // *main.person	fmt.Println(t3)      // main.person	fmt.Println(t.Kind()) // ptr	fmt.Println(t2.Kind()) // ptr	fmt.Println(t3.Kind()) // struct	fmt.Println(t2.Elem().Kind()) // struct	//fmt.Println(t3.Elem().Kind()) // exception	fmt.Println(t.name())   //	fmt.Println(t.Align())  // 8	fmt.Println(t.Elem().NumFIEld()) // 2	fmt.Println(t.Elem().NumMethod()) // 2	//fmt.Println(t.NumFIEld()) // exception	fmt.Println(t.NumMethod()) // 2	fmt.Println(t.String()) // *main.person	fmt.Println(t.Elem().String()) // main.person	fmt.Println(t.Size()) // 8	fmt.Println(t.PkgPath())	fmt.Println(v.Elem().NumFIEld()) // 2	fmt.Println(v.Elem().NumMethod()) // 2	//fmt.Println(v.NumFIEld()) // exception	fmt.Println(v.NumMethod()) // 2	fmt.Println(v.Kind()) // ptr	fmt.Println(v.Elem().Kind()) // struct	fmt.Println(v.String()) // <*main.person Value>	fmt.Println(v.Type()) // *main.person	fmt.Println(v.CanSet()) // false	fmt.Println(v.Elem().CanSet()) // true	fmt.Println(v.Interface()) // &{yunhai 23}	fmt.Println(v.Elem().Interface()) // {yunhai 23}	fmt.Println(v.NumMethod()) // 2	for i:=0 ;i < v.Elem().NumFIEld();i++{		f := v.Elem().FIEld(i)		fmt.Println(i,t.Elem().FIEld(i).name,f.Kind(),f.Type(),f.Interface())		/*		0 name string string yunhai                1 Age int int 23		*/	}	for i:=0;i < v.Elem().NumMethod();i++{		m := v.Elem().Method(i)		fmt.Println(i,t.Elem().Method(i).name,m.Kind(),m.Type(),m.Interface())		/*		 0 GetAge func func() int 0x108c410                 1 Getname func func() string 0x108c410		*/		fmt.Println(m.Type().NumIn()) // 0 参数个数		//fmt.Println(m.Type().In(0)) // exception		fmt.Println(m.Type().NumOut()) // 1  返回值个数		fmt.Println(m.Type().Out(0)) // 返回值类型		m.Call(nil)	}	fmt.Println(v.Elem().MethodByname("Getname")) //0x108c410	fmt.Println(v.Elem().MethodByname("Getname").Call(nil))  // [yunhai]	var obj interface{} = pers	switch ins:=obj.(type) {	case *person:		fmt.Println("case",ins) // case &{yunhai 23}	}	maptest := make(map[int]string,10)	maptest[0] = "value1"	maptest[1] = "value2"	m_t := reflect.TypeOf(maptest)	m_v := reflect.ValueOf(maptest)	fmt.Println(m_t)  // map[int]string	fmt.Println(m_t.Kind()) // map	fmt.Println(m_t.Elem().Kind()) // string	fmt.Println(m_t.Size()) // 8	//fmt.Println(m_t.Len()) // only array	fmt.Println(m_v)  // map[1:value2 0:value1]	//fmt.Println(m_v.Cap()) //  Array,Chan,or Slice.    fmt.Println(m_v.MapKeys()) // [<int Value> <int Value>]}
总结

以上是内存溢出为你收集整理的Golang反射全部内容,希望文章能够帮你解决Golang反射所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1273199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存