• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go语言反射之值反射

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1 概述

反射不仅可以获取值的类型信息,还可操作变量的值。使用 reflect.Value 类型操作变量的值。

2 值反射对象

reflect.ValueOf() 方法可以获取一个值的反射对象,之后可以获取值的相关信息,或者获取这个值。示例:

  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() int64func (v Value) Float() float64func (v Value) String() string 等。

3 修改值

利用反射可以完成值的修改,func (v Value) Elem() Value 方法获取值反射对应的元素,再利用 类setType 方法完成设置,示例:

v := 42
valueV := reflect.ValueOf(&v)
valueV.Elem().SetInt(1024)
fmt.Println(v) // 1024

注意,修改值需要满足可被寻址的要求,因此我们使用的是 reflect.ValueOf(&v)

4 修改结构体字段值

反射修改结构体字段,需要先获取结构体的值反射对象,再去确定字段,再去修改。演示为:

  s := &Stu{
    "Hank",
  }
  valueS := reflect.ValueOf(s)
  valueS.Elem().FieldByName("Name").SetString("Kang")
  fmt.Println(s.Name) // Kang

注意,修改结构体字段时,要保证字段能被导出,首字母大写。

完!
原文出自:小韩说课
微信关注:小韩说课


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
第二十五期:知乎用Go替代Python,说明了啥发布时间:2022-07-10
下一篇:
go时间模块发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap