Go语言反射之值反射

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

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

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() int64 , func (v Value) Float() float64 , func (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语言反射之值反射


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

查看所有标签

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

六度分隔

六度分隔

邓肯·J·瓦茨 / 陈禹 / 中国人民大学出版社 / 2011-3 / 46.00元

正如副标题所表明的,《六度分隔:一个相互连接的时代的科学》的基本内容是介绍一门正在形成中的新科学——关于网络的一般规律的科学。有这样一门科学吗?它的内容和方法是什么?近年来,这门学科有什么实质性的进展吗?在《六度分隔:一个相互连接的时代的科学》中,作者根据自己的亲身经历娓娓道来,用讲故事的方式,对于这些问题给出了令人信服的回答 除了简要的背景和总结以外,《六度分隔:一个相互连接的时代的科学》......一起来看看 《六度分隔》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具