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 ...
随机推荐
- Express基础单词
访问请求对象(request)或(req) 响应对象(response)或(res) 中间件(middleware) http的请求方法(method) 服务器的路径(path) 路由匹配时的函数(c ...
- selenium3 文件系列之------ opencsv读取csv文件
最近在学习selenium有关文件的读取测试,今天先总结一下如何读取csv文件.CSV的定义是与逗号分隔的值(Comma-Separated Values),在Java中需要用到第三方lib去处理读取 ...
- 用python实现ARP欺骗
首先介绍一个python第三方库--Scapy,这个库不是标准库,默认是没有的,需要安装,不过在kali-linux里边是默认安装的, 这里我用kali做攻击者,xp做受害者 关于Scapy Scap ...
- Oracle ORA-12541,ORA-12514错误
1.昨天发布tomcat 成功,但登录后报错,无法打开hibernate session,检查后发现数据库无法连接 2.用PL/SQL登录数据库,报 ora-12541,TNS 无监听程序,百度发现需 ...
- java内部类(一)
内部类(一) 一.定义: 内部类就是定义在另一个类内部的类,与之对应,包含内部类的类就是外部类. 二.作用: 1.内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包之中的其他类访问该类 ...
- Wireshark抓包实例诊断TCP连接问题
转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 前文论述了TCP基础知识,从本节开始,通过TCP抓包实例来诊断TCP常见问 ...
- unity加载ab后,场景shader不起效问题(物件表现黑色)
需要把unity自带的shader,加入到默认列表
- 超好用的Vim配置
https://github.com/ma6174/vim-deprecated 简易安装方法: 打开终端,执行下面的命令就自动安装好了: wget -qO- https://raw.github.c ...
- boost::make_function_output_iterator报错: C4996
用VS2013运行boost::make_function_output_iterator的官方例子: https://www.boost.org/doc/libs/1_68_0/libs/itera ...
- 主流CTR预估模型的演化及对比
https://zhuanlan.zhihu.com/p/35465875 学习和预测用户的反馈对于个性化推荐.信息检索和在线广告等领域都有着极其重要的作用.在这些领域,用户的反馈行为包括点击.收藏. ...