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语言反射之值反射的更多相关文章

  1. Go语言反射之类型反射

    1 概述 类似于 Java,Go 语言也支持反射.支持反射的语言可以在运行时对程序进行访问和修改.反射的原理是在程序编译期将反射信息(如类型信息.结构体信息等)整合到程序中,并给提供给程序访问反射信息 ...

  2. Go语言的接口与反射

    美女图片没啥用,就是为了好看 本文还在完善中... go总体而言是一门比较好入门的语言,许多特性都很精简易懂,但是接口与反射除外.他们真的让人头疼,不知道是自身资质问题还是怎么着,总是觉得很多书上写的 ...

  3. 【记录】【java】反射设值取值

    1.设值 /** * 根据属性名设置属性值 * * @param fieldName * @param object * @return */ public boolean setFieldValue ...

  4. Final修饰的字段是否可以通过反射设置值

    案发现场 经常听说final修饰的字段是常量不能改变的他的值,但是以外发现 Integer.java源码中的字段“value”是final,但是可以通过反射改变他的值. public final cl ...

  5. Go语言深度比较值是否相等

    Go语言深度比较值是否相等 需求描述: 我们在开发过程中经常会遇到一些需要比较值是否相等的场景,例如比较两个数组.结构体.Map.等,自己写这些代码比较繁琐,大部分时候这里都可以使用到反射reflec ...

  6. Java---类反射(1)---类反射入门和基础

    什么是类反射 ☆什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方 ...

  7. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

  8. 【反射】Java反射机制

    Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以 ...

  9. 乐字节Java反射之四:反射相关操作

    大家好,乐字节小乐继续为Java初学者讲述Java基础知识.上次说到乐字节Java反射之三:方法.数组.类加载器,这次是Java反射之四:反射相关操作 1.操作属性 //1.获取Class对象 Cla ...

随机推荐

  1. Linux下的Mysql的远程访问

    mysql的服务端[192.168.25.136] 1,在远程访问之前需先配置防火墙 service iptables stop (不推荐,可配置开通3306端口) 2,授权 mysql> gr ...

  2. Exchange Server 产品路线图 及 补丁下载

    Exchange Server RU listExchange Server and Update Rollup Build Numbers -TechNet Articles -United Sta ...

  3. How to Remove A Service Entry From Win10 Service List

    Warning Please do this operation CAREFULLY, otherwise you may get something wrong with your system. ...

  4. August 12th 2017 Week 32nd Saturday

    That which does not kill us makes us stronger. 但凡不能杀死你的,最终都会使你更强大. Seemingly I have heard this from ...

  5. 51nod 1102 面积最大的矩形

    题目地址在这儿 求取:以某矩形g[i]为最小值的区间的左右端点,得到一个临时解.所有临时解中的最大值即为解. 求取区间的方法可以用单调栈,也可以用下面这种十分简洁的类似于递归的方法.下面这种解法求出来 ...

  6. Hydra初识

    Hydra词出自希腊神话,原意是是九头蛇,后被赫拉克罗斯所杀,成为赫拉克罗斯的12件伟大功绩之一.而在计算机上HC-HYDRA是一个支持多种网络服务的非常快速的网络登陆破解工具.支持ssh,RDP,M ...

  7. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  8. JAVA Color类

    Color类用于定义颜色,java.awt.Color中提供了13个预定义的常量用来表示13中标准颜色,分别是: public static final Color white白色. public s ...

  9. 24、springboot与缓存(2)

    具体看上文!!! @Service public class EmpService { @Autowired EmployeeMapper employeeMapper; @Cacheable(cac ...

  10. Kali-linux绘制网络结构图

    CaseFile工具用来绘制网络结构图.使用该工具能快速添加和连接,并能以图形界面形式灵活的构建网络结构图.本节将介绍Maltego CaseFile的使用. 在使用CaseFile工具之前,需要修改 ...