GoLang之反射
反射
反射(reflect)
所谓反射(reflect)就是能检查程序在运行时的状态。
使用反射的三条定律:
- 反射可以将“接口类型变量”转换为“反射类型对象”;
- 反射可以将“反射类型对象”转换为“接口类型变量”;
- 如果要修改“反射类型对象”,其值必须是“可写的”;
使用reflect一般分成三步:
1、要去反射是一个类型的值(这些值都实现了空接口),首先需要把它转化成reflect对象(reflect.Type 或 reflect.Value):
func TypeOf(i iterface{}) Type // 返回接口中保存的值的类型,TypeOf(nil)会返回nil。
func ValueOf(i iterface{}) Value // 返回一个初始化为i接口保管的具体值的Value,ValueOf(nil)返回Value零值。
2、将reflect对象转化成相应的值,例如:
tag := t.Elem().Field(0).Tag // 获取定义在struct里面的标签
name := v.Elem().Field(0).String() // 获取存储在第一个字段里面的值
3、获取反射值能返回相应的类型和数值
var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())
最后,反射的话,那么反射的字段必须是可修改的。反射的字段必须是可读写的意思是,如果下面这样写,那么会发生错误
var x float64 = 3.4
v := reflect.ValueOf(x)
v.SetFloat(7.1)
如果要修改相应的值,必须这样写
var x float64 = 3.4
p := reflect.ValueOf(&x)
v := p.Elem()
v.SetFloat(7.1)
struct tag
先看一个例子,如何获取struct tag:
type User struct {
Name string `user_name`
Age int `age`
}
func (this *User) AddAge() {
this.Age +=
}
func main() {
user := &User{"John", }
t := reflect.TypeOf(user)
s := t.Elem()
for i := ; i < s.NumField(); i++ {
fmt.Println(s.Field(i).Tag)
}
}
GoLang之反射的更多相关文章
- Golang的反射reflect深入理解和示例
编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examin ...
- Golang通过反射获取结构体的标签
Golang通过反射获取结构体的标签 例子: package main import ( "fmt" "reflect" ) type resume struc ...
- Golang通过反射拼接一个结构体所有字段
golang通过反射拼接一个结构体所有字段 需求 将一个结构体所有字段以"|"连接拼接成字符串 golang 不同类型拼接成string使用Sprintf比较麻烦,如果一个结构体有 ...
- golang(11) 反射用法详解
原文链接:http://www.limerence2017.com/2019/10/14/golang16/ 反射是什么 反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如py ...
- Golang reflect 反射
反射的规则如下: 从接口值到反射对象的反射 从反射对象到接口值的反射 为了修改反射对象,其值必须可设置 -------------------------------------------- ...
- Golang之反射(重点!!)
1.反射:可以在运行时动态获取变量的相关信息 Import(“reflect”) 两个函数: reflect.TypeOf()//获取变量的类型,返回reflect.Type类型reflect.Val ...
- golang--深入简出,带你用golang的反射撸一个公用后台查询方法
一些基本方法 本篇不会介绍反射的基本概念和原理等,会从每个常用的方法入手,讲解一些基本和进阶用法,反射不太适合在业务层使用,因为会几何倍的降低运行速度,而且用反射做出来的程序健壮度不高,一旦一个环节没 ...
- 『GoLang』反射
方法和类型的反射 反射是应用程序检查其所拥有的结构,尤其是类型的一种能.每种语言的反射模型都不同,并且有些语言根本不支持反射.Go语言实现了反射,反射机制就是在运行时动态调用对象的方法和属性,即可从运 ...
- golang通过反射动态调用方法
func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value, error) { f ...
随机推荐
- 考前停课集训 Day2 非
因为太长了 所以一天一天分开发 Day2 昨天晚上没开黑车 没脱衣服就睡了 可能是我难受了…… 新的一天. 早上好. 我没去晨跑,早上先和团长集合了,没看见rkbudlo来 于是就先吃饭了 去机房的时 ...
- C++学习笔记50:队列类模板
队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h ...
- javaweb笔记
(1)web项目需复制web.xml文件 (2)需要复制classes文件 需要把bin里面的com----复制到classes中
- 3ds max 学习笔记(四)--创建物体
添加物体: 1.初创建物体,从单视图进行创建,便于处于同一平面,在透视图观看效果.2.在基本对象处选择“长方体”:左键开始制作,松开左键此时控制的是长方形的高,然后点击左键完成:注:在max里点击右键 ...
- 深入理解this,bind、call
直接看this 直接看call和bind 首先放一道题: var a={ a:'haha', getA: function(){ console.log(this.a); } } var b= { a ...
- Glide 4.0.0 下之加载本地缓存的图片
在网上搜了下,无意中发现RequestOptions还有个方法: onlyRetrieveFromCache 用了下是OK的 try { File imageFile = Glide.with(con ...
- iOS NSDictionary 转Json 去掉换行去掉空格
//dic 转json 如果用系统自带的会出现空格. + (NSString *)returnJSONStringWithDictionary:(NSDictionary *)dictionary{ ...
- python接口自动化测试(五)-其它(认证&代理&超时配置)
有了前面几节的介绍,基本的接口测试是可以满足了.本节一些其它的高级技巧: 一.认证 1.基本认证: # -*- coding:utf-8 -*- import requests url = " ...
- Xtrabackup简介
Xtrabackup是由 Percona 开发的一个开源软件,可实现对 InnoDB 的数据备份,支持在线热备份(备份时不影响数据读写),特点如下: 备份过程快速.可靠: 备份过程不会打断正在执行的事 ...
- 在netty3.x中存在两种线程:boss线程和worker线程。
在netty 3.x 中存在两种线程:boss线程和worker线程.