反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

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反射举例的更多相关文章

  1. golang反射初试

    golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST. t := reflect.TypeOf(obj) 使用TypeOf( ...

  2. golang 反射应用(二)

    golang反射应用(二) package test import ( "reflect" "testing" ) //定义适配器 func TestRefle ...

  3. Golang反射机制

    Go反射机制:在编译不知道类型的情况下,可更新变量.在运行时查看值.调用方法以及直接对它们的布局进行操作. 为什么使用反射 有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口, ...

  4. [golang]反射的用处--代码自动生成

    背景: go语言处理db.json的时候,具体代码的变量定义和db字段.json输出的时候可能不一样. 这个时候,我们需要用tag的方式来进行定义. 例如: type MyStruct struct ...

  5. GOLANG 反射法则

    译自[blog.golang.org/laws-of-reflection] 在计算机中, 反射是程序通过类型,检测到它自己的结构能力:是一种元编程程:也是一个具大的混淆点 在本文中,我们将通过解释反 ...

  6. golang 反射

    参考:|--http://blog.51cto.com/speakingbaicai/1707637 |--https://studygolang.com/articles/6324 反射是在gola ...

  7. golang 反射中调用方法

    反射中调用函数 众所周知,golang中的函数是可以像普通的int.float等类型变量那样作为值的,例如: package main import "fmt" func hell ...

  8. Java反射举例

    本文參考:http://www.cnblogs.com/yydcdut/p/3845430.html 1.Java反射的基本介绍 Java的反射很强大,传递class. 能够动态的生成该类.取得这个类 ...

  9. GO开发[六]:golang反射(reflect)

    反射 反射:可以在运行时动态获取变量的相关信息 ​ Import ("reflect") reflect.TypeOf,获取变量的类型,返回reflect.Type类型 refle ...

随机推荐

  1. C Looooops POJ - 2115 (exgcd)

    一个编译器之谜:我们被给了一段C++语言风格的循环 for(int i=A;i!=B;i+=C) 内容; 其中所有数都是k位二进制数,即所有数时膜2^k意义下的.我们的目标时球出 内容 被执行了多少次 ...

  2. 【BZOJ1015】【JSOI2008】星球大战 并查集

    题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...

  3. 天哪又要搬家啦qvq

    CSDN现在怎么这么好看了qvq 搬家回去的欲望日渐强烈... update:2019/02/25 被csdn的侧栏广告烦死了

  4. 概率DP自学

    转自https://blog.csdn.net/zy691357966/article/details/46776199 zy691357966的blog 有关概率和期望问题的研究 摘要 在各类信息学 ...

  5. python3 hashlib模块

    hashlib是一个加密模块,可以将明文加密为密文: md5,sha加密:过程不可逆转.

  6. stm32使用rt-thread在文件《stm32f1xx_hal.h》中头文件包含顺序引出的错误

    @2019-01-24 [小记] 在学习 rt-thread BSP制作过程中,发现文件<stm32f1xx_hal.h>中 Env工具生成的原始顺序 1. #include " ...

  7. chattr命令详解

    [root@localhost ~]# usermod -L yan[root@localhost ~]# passwd -S yanyan LK 2016-07-11 0 99999 7 -1 (密 ...

  8. 单片机的基本构成、工作原理 LET′S TRY“嵌入式编程”: 1 of 6

    单片机的基本构成.工作原理 LET′S TRY“嵌入式编程”: 1 of 6 本连载讲解作为嵌入式系统开发技术人员所必需具备的基础知识.这些基础知识是硬件和软件技术人员都应该掌握的共通技术知识.有了电 ...

  9. DHU--1247 Hat’s Words && HiHocder--1014 Trie树 (字典树模版题)

    题目链接 DHU--1247 Hat’s Words HiHocder--1014 Trie树 两个一个递归方式一个非递归 HiHocoder #include<bits/stdc++.h> ...

  10. 使用Docker Swarm搭建分布式爬虫集群

    https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...