golang 反射 reflect 设置 struct 字段
目录
说明1 reflect.Value区分CanSet和Can not Set
说明2 将值转成reflect.Value类型
说明3 reflect.ValueOf 参数必须是一个 指针 或 interface Elem()才可以正常调用
实例代码
说明1 reflect.Value区分CanSet和Can not Set
所以, 必须要返回成Can set的reflect.Value
如:
s := reflect.ValueOf(&t).Elem()
然后就可以happy的设值了, 可是不能随便设值的, 一个通用的方法就是使用Set(v Value)方法,
说明2 将值转成reflect.Value类型
下面的这段代码就是转成Value类型
sliceValue := reflect.ValueOf([]int{1, 2, 3}) // 这里将slice转成reflect.Value类型
说明3 reflect.ValueOf 参数必须是一个 指针 或 interface Elem()才可以正常调用
func (Value) Elem
func (v Value) Elem() Value
Elem returns the value that the interface v contains or that the pointer v points to. It panics if v's Kind is not Interface or Ptr. It returns the zero Value if v is nil.
Elem返回接口v包含的值或指针v指向的值。 如果v的Kind不是Interface或Ptr,它会感到恐慌。 如果v为零,它将返回零值。
实例代码
代码1:
func Destroy(subj interface{}) {stype := reflect.ValueOf(subj).Elem()field := stype.FieldByName("Status")if field.IsValid() {field.SetString("Destroyed")}
}func TestDestroy(t *testing.T) {// Initialize datajaeger := Jaeger{Name: "Cherno Alpha", Country: "RU", Status: "Active"}kaiju := Kaiju{Alias: "Scissure", Origin: "Sydney", Status: "Unknown"}shatterdome := Shatterdome{Location: "Lima"}// Destroy everythingDestroy(&jaeger)Destroy(&kaiju)Destroy(&shatterdome)// Check the resultif jaeger.Status != "Destroy" {t.Error("jaeger was not destroyed")}if kaiju.Status != "Destroy" {t.Error("kaiju was not destroyed")}
}
代码2:
type T struct {Age intName stringChildren []int
}
t := T{12, "someone-life", nil}
s := reflect.ValueOf(&t).Elem()s.Field(0).SetInt(123) // 内置常用类型的设值方法
sliceValue := reflect.ValueOf([]int{1, 2, 3}) // 这里将slice转成reflect.Value类型
s.FieldByName("Children").Set(sliceValue)
golang 反射 reflect 设置 struct 字段相关推荐
- golang 反射 reflect包 struct相互填充
最近在用Golang写一些简单的业务,经常需要在两类相似的结构体之间相互填充数据,如果struct只有少数几个field,相互赋值还好:struct有很多field的,实例代码如下: type Req ...
- Golang 通过jsonTag设置Struct或者Struct数组中的字段
原文地址声明:https://blog.csdn.net/qq_23179075/article/details/118394526 package commonimport ("fmt&q ...
- golang 反射 获取 设置 结构体 字段值
实例如下: type MyStruct struct {N int } n := MyStruct{ 1 }// get immutable := reflect.ValueOf(n) val := ...
- Golang的反射reflect深入理解和示例
[TOC] Golang的反射reflect深入理解和示例 [记录于2018年2月] 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机 ...
- go struct 静态函数_Go语言学习笔记(四)结构体struct 接口Interface 反射reflect...
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Golang反射机制的实现分析——reflect.Type方法查找和调用
在<Golang反射机制的实现分析--reflect.Type类型名称>一文中,我们分析了Golang获取类型基本信息的流程.本文将基于上述知识和经验,分析方法的查找和调用.(转载请指明出 ...
- golang中struct字段
golang中struct字段名首字母必须大写,不然json无法解析 golang中struct字段后面json字段要小写或小写加下划线 golang中首字母大写表示共有
- Go语言--反射(reflect)
0 反射的概念 反射是指计算机程序在运行时(runtime)可以访问.检测和修改本身状态或行为的一种能力.通俗地将,反射就是程序能够在运行时动态地查看自己的状态,并且允许修改自身的行为. 程序在编译时 ...
- 浅谈Java反射(Reflect)技术--常用方法
Java反射(Reflect)技术 概念:动态获取在当前Java虚拟机中的类.接口或者对象等等信息(运行过程中读取内容) 1.作用(面试问题): 1.1 解除两个类之间的耦合性,即在未得到依赖类的情况 ...
最新文章
- js正则表达式/replace替换变量方法
- spring注解--@Bean
- 重磅!可以发朋友圈和搜一搜的PC端微信来了,赶紧来下载!
- YUV 后面数字的含义_高速公路标示牌上的字母和数字,到底什么意思?很多人都不知道...
- 手把手教你建github技术博客
- 文件包含漏洞不能包含php,ThinkPHP5漏洞分析之文件包含
- Combobox 控件绑定数据
- 导出excel数字前面的0消失_Excel操作中常见的3大坑你遇到过吗?遇到应该这么解决...
- 二级缓存失效_缓存核心技术:缓存穿透、缓存并发、缓存失效之思路变迁
- javascript date utc
- maven,eclipse--build时出现No compiler is provided in this environment
- ModbusTcp协议详解
- PMP考试心得分享(已通过)
- LVDT/RVDT(线性/旋转可变差动变压器)、Resolver(旋转变压器)仿真方案
- UnityShader笔记第三课-MVP矩阵原理-M矩阵
- 判断一个数是不是2的N次方 自己写的土算法
- U盘变32G的解决办法
- 魔改插线板,让电视控制周边设备开关机
- 2019北邮网安院机试真题(回忆版)@lantin
- 激活函数activation总结