首页 > 代码库 > Go--反射篇
Go--反射篇
反射的规则如下:
从接口值到反射对象的反射
从反射对象到接口值的反射
为了修改反射对象,其值必须可设置
---------------------------------------------------------
reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值。
范例
package main import ( "fmt" "reflect" ) type MyStruct struct { name string } func (this *MyStruct) GetName() string { return this.name } func main() { fmt.Println("--------------") var a MyStruct b := new(MyStruct) fmt.Println(reflect.ValueOf(a)) fmt.Println(reflect.ValueOf(b)) fmt.Println("--------------") a.name = "show" b.name = "show" val := reflect.ValueOf(a).FieldByName("name") //painc: val := reflect.ValueOf(b).FieldByName("name") fmt.Println(val) fmt.Println("--------------") fmt.Println(reflect.ValueOf(a).FieldByName("name").CanSet()) fmt.Println(reflect.ValueOf(&(a.name)).Elem().CanSet()) fmt.Println("--------------") var c string = "show" p := reflect.ValueOf(&c) fmt.Println(p.CanSet()) //false fmt.Println(p.Elem().CanSet()) //true p.Elem().SetString("newName") fmt.Println(c) }
想更好的理解 go 的反射机制,可以从应用场景入手
go语言reflect包使用的几个场景 :
1. 遍历结构体字段名(避免代码的硬编码)
2. 调用结构体方法(自动映射)
3. 获取结构体的tag标记的值(json/xml转换)
Go--反射篇
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。