Go语言反射之值反射

hanzkering · · 1807 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

## 1 概述 反射不仅可以获取值的类型信息,还可操作变量的值。使用 `reflect.Value` 类型操作变量的值。 <!-- more --> ## 2 值反射对象 `reflect.ValueOf()` 方法可以获取一个值的反射对象,之后可以获取值的相关信息,或者获取这个值。示例: ```go v := make([]int, 10) valueV := reflect.ValueOf(v) fmt.Println(valueV.IsValid()) // true fmt.Println(valueV.IsNil()) // false fmt.Println(valueV.Interface().([]int)) // [0 0 0 0 0 0 0 0 0 0] fmt.Println(valueV.Slice(0, valueV.Len())) // [0 0 0 0 0 0 0 0 0 0] ``` * `.IsValid()` 和 `.IsNil()`,是获取值的信息,判断是否合法和是否为Nil。 * `.Interface().([]int)`,利用类型断言获取原始值。 * `.Slice(0, valueV.Len())`,通过类型获取原始值。 获取值的操作支持很多,对应的数据类型都支持。例如 `func (v Value) Int() int64`, `func (v Value) Float() float64`,`func (v Value) String() string` 等。 ## 3 修改值 利用反射可以完成值的修改,`func (v Value) Elem() Value` 方法获取值反射对应的元素,再利用 `类setType` 方法完成设置,示例: ```go v := 42 valueV := reflect.ValueOf(&v) valueV.Elem().SetInt(1024) fmt.Println(v) // 1024 ``` 注意,修改值需要满足可被寻址的要求,因此我们使用的是 `reflect.ValueOf(&v)`。 ## 4 修改结构体字段值 反射修改结构体字段,需要先获取结构体的值反射对象,再去确定字段,再去修改。演示为: ```go s := &Stu{ "Hank", } valueS := reflect.ValueOf(s) valueS.Elem().FieldByName("Name").SetString("Kang") fmt.Println(s.Name) // Kang ``` 注意,修改结构体字段时,要保证字段能被导出,首字母大写。 完! 原文出自:[小韩说课](http://www.hellokang.net/go/go-reflect-value/) 微信关注:小韩说课 ![小韩说课](http://www.hellokang.net/images/wechat_subscription.jpg)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1807 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传