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() 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语言反射之值反射


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

查看所有标签

猜你喜欢:

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

C语言基础

C语言基础

安博教育集团 / 2012-2 / 37.00元

《C语言基础》深入浅出地介绍了C语言程序设计的基础知识,内容涉及C语言基础、算法基础、变量、数据类型、运算符、输入/输出相关函数、选择结构、循环结构、各种表达式、数组、字符串、指针、函数、结构体、ISO C99的扩展语法等。全书内容丰富,结构严谨,层次清晰,语言生动,论述精准而深刻,实例丰富而实用。 《C语言基础》不仅适合用做计算机职业培训的首选教材,也可作为普通高校教材使用,更是C语言初学......一起来看看 《C语言基础》 这本书的介绍吧!

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

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具