golang反射举例
反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
package main import (
"fmt"
"reflect"
) type stu struct {
Name string `json:"name"`
Age int `json:"age"`
intro string
} func (t stu) Print() {
fmt.Println("---start---")
fmt.Println(t)
fmt.Println("---end---")
} func (s stu) GetSum(n1, n2 int) {
fmt.Println(n1 + n2)
} func (s stu) Set(name string, age int, intro string) {
s.Name = name
s.Age = age
s.intro = intro
} func (s stu) Aa() {
fmt.Println("aaaa")
} func test(a interface{}) {
typ := reflect.TypeOf(a)
val := reflect.ValueOf(a) kid := val.Kind() if kid != reflect.Struct {
fmt.Println("expect struct")
return
} num := val.NumField() fmt.Printf("struct has %d fields\n", num) for i := 0; i < num; i++ {
fmt.Printf("field %d is value=%v \n", i, val.Field(i)) tagval := typ.Field(i).Tag.Get("json") if tagval != "" {
fmt.Printf("field %d is tag=%v\n", i, tagval)
}
} numMethon := val.NumMethod() fmt.Printf("stuct has %d methons\n", numMethon) var r = []reflect.Value{
reflect.ValueOf(10),
reflect.ValueOf(20),
}
val.Method(1).Call(r)
} func main() {
var animal stu = stu{
Name: "黄鼠狼",
Age: 22,
intro: "爱吃老鼠",
} test(animal)
}

.Call()方法
func (v Value) Call(in []Value) []Value
使用输入的参数in调用v持有的函数。例如,如果len(in) == 3,v(in[0], in[1], in[2])(其中Value值表示其持有值), 0 1 2 4根据首字母的asiic码值进行排序,如此处需要A 0 G 1 以此类推。
in参数接收一个reflect.Value封装的切片[],返回输出结果也是reflect.Value封装的切片[] q
method方法
func (v Value) Method(i int) Value
返回v持有值类型的已绑定的第i个方法(到v的持有值的)状态的函数形式的reflect.Value封装。返回值调用Call方法时不应包含接收者
rm := val.Method(1)
fmt.Printf("methon type is: %v", &rm)
返回值为指针类型,

golang反射举例的更多相关文章
- golang反射初试
golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST. t := reflect.TypeOf(obj) 使用TypeOf( ...
- golang 反射应用(二)
golang反射应用(二) package test import ( "reflect" "testing" ) //定义适配器 func TestRefle ...
- Golang反射机制
Go反射机制:在编译不知道类型的情况下,可更新变量.在运行时查看值.调用方法以及直接对它们的布局进行操作. 为什么使用反射 有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口, ...
- [golang]反射的用处--代码自动生成
背景: go语言处理db.json的时候,具体代码的变量定义和db字段.json输出的时候可能不一样. 这个时候,我们需要用tag的方式来进行定义. 例如: type MyStruct struct ...
- GOLANG 反射法则
译自[blog.golang.org/laws-of-reflection] 在计算机中, 反射是程序通过类型,检测到它自己的结构能力:是一种元编程程:也是一个具大的混淆点 在本文中,我们将通过解释反 ...
- golang 反射
参考:|--http://blog.51cto.com/speakingbaicai/1707637 |--https://studygolang.com/articles/6324 反射是在gola ...
- golang 反射中调用方法
反射中调用函数 众所周知,golang中的函数是可以像普通的int.float等类型变量那样作为值的,例如: package main import "fmt" func hell ...
- Java反射举例
本文參考:http://www.cnblogs.com/yydcdut/p/3845430.html 1.Java反射的基本介绍 Java的反射很强大,传递class. 能够动态的生成该类.取得这个类 ...
- GO开发[六]:golang反射(reflect)
反射 反射:可以在运行时动态获取变量的相关信息 Import ("reflect") reflect.TypeOf,获取变量的类型,返回reflect.Type类型 refle ...
随机推荐
- bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1015 思路: 题目是要我们对当前图拆掉k个点,问,每拆一个点后图中有多少个联通块,我们可以逆 ...
- MT【252】椭圆内接三角形内切圆半径
已知椭圆$\dfrac{{{x^2}}}{{{a^2}}} + \dfrac{{{y^2}}}{{{b^2}}} = 1$($a > b > 0$),${F_1}$.${F_2}$为其左右 ...
- 【Gym - 100796C 】Minimax Tree
BUPT2017 wintertraining(15) #7FMinimax Tree 题意 给你一棵多叉树,非叶子节点中分配k个为子节点的min函数,剩下的是max函数. 现在求根节点(1)的最大值 ...
- 加载样式TTFB waiting时间长
1.谷歌浏览器64位 2.在调试网页的时候,每回修改一个,刷新时,速度很慢 3.结果很恼火.每调试一回等半天.效率低下.... 解决办法是: "在每个CSS规则的后面加一个空行". ...
- Spring Boot 1.X和2.X优雅重启实战
纯洁的微笑 今天 项目在重新发布的过程中,如果有的请求时间比较长,还没执行完成,此时重启的话就会导致请求中断,影响业务功能,优雅重启可以保证在停止的时候,不接收外部的新的请求,等待未完成的请求执行完成 ...
- poj1845 Sumdiv
poj1845 Sumdiv 数学题 令人痛苦van分的数学题! 题意:求a^b的所有约数(包括1和它本身)之和%9901 这怎么做呀!!! 百度:约数和定理,会发现 p1^a1 * p2^a2 * ...
- 洛谷P3354 河流
有点权边权的树,选出k个关键点,根必须选.每个点的贡献为点权 * 到最近的关键祖先的距离.求最小总贡献. 解:树形DP是最毒瘤的算法...... 设fxij表示以x为根的子树中选了j个关键点,且x的最 ...
- 机器学习三剑客之matplotlib 数据绘图展示
线型图: #导包 import matplotlib.pyplot as plt #导入字体库 from matplotlib.font_manager import FontProperties # ...
- pycharm 出现 "PEP:8 expected 2 blank lines ,found 0"
https://blog.csdn.net/modangtian/article/details/79687623 这句话的意思是“有两个空白行,但是没有发现.” 在声明函数的那一行的上方必须有两行的 ...
- cnblogs latex公式
选项->启用数学公式支持 \begin{equation*} \begin{split} &xxx\\ &xxx\\ \end{split} \end{equation*} (\ ...