Go语言反射之值反射

栏目: Go · 发布时间: 6年前

内容简介:反射不仅可以获取值的类型信息,还可操作变量的值。使用获取值的操作支持很多,对应的数据类型都支持。例如

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

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

完! 原文出自: 小韩说课 微信关注:小韩说课 Go语言反射之值反射


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

运营前线 2

运营前线 2

兰军 等著 / 机械工业出版社 / 2017-4 / 69.00

“运营前线”是一个系列,目前已经出版2部,与“产品前线”一样,该系列书也由资深的产品和运营专家兰军(Blues)领衔策划和写作,旨在梳理和总结国内一线互联网公司的运营方法和技巧,让所有产品人和运营人都有机会了解和学习这些大的互联网公司是如何做运营的。 这2部作品汇集了来自腾讯、阿里、百度、360、迅雷、YY、小米、爱奇艺、乐视等数十家大型互联网公司的一线运营专家的技巧和方法论。共包含9大运营......一起来看看 《运营前线 2》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器