博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang 简单的反射
阅读量:5733 次
发布时间:2019-06-18

本文共 3219 字,大约阅读时间需要 10 分钟。

hot3.png

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) int 
0} // 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}}

 

转载于:https://my.oschina.net/u/3529405/blog/1590699

你可能感兴趣的文章
Linux-Centos启动流程
查看>>
php 设计模式
查看>>
后端技术精选 - 收藏集 - 掘金
查看>>
Laravel 服务容器
查看>>
Spring Websocket/STOMP 和SpringSession整合 初步
查看>>
SVG蒙版(mask)的基础使用教程
查看>>
PHP八大安全函数解析
查看>>
使用 Electron 将应用程序放入托盘
查看>>
6天面试、斩获6家硅谷巨头Offer,我是如何做到的?
查看>>
TensorFlow 1.0已死,TensorFlow 2.0万岁
查看>>
Scala模式匹配的亮点——Martin Odersky访谈(四)
查看>>
mac安装kubernetes并运行echoserver
查看>>
多页架构的前后端分离方案(webpack+express)
查看>>
MongoDB Mobile Sync for iOS推出Beta版本
查看>>
SOA与微服务的比较和对比
查看>>
Russ Miles:被忽略的架构师和混沌工程
查看>>
Instagram如何跨大洋拆分有状态服务
查看>>
AWS推出深度学习容器,简化AI程序开发
查看>>
Kafka团队修改KSQL开源许可,怒怼云厂商
查看>>
算法(第4版) Chapter 1
查看>>