golang 反射应用(二)
golang反射应用(二)
package test
import (
"reflect"
"testing"
)
//定义适配器
func TestReflect(t *testing.T){
//声明回调函数
call1 := func(v1,v2 int){
t.Log(v1,v2) //1 2
}
call2 := func(v1,v2 int,s string){
t.Log(v1,v2,s) //1 2 test2
}
//定义全局变量
var (
function reflect.Value
inValue []reflect.Value
n int
)
bridge := func(call interface{},args... interface{}){
n = len(args)
inValue = make([]reflect.Value,n)
for i:=0;i<n;i++{
inValue[i] = reflect.ValueOf(args[i])
}
//将一个interface转换我Value类型
function = reflect.ValueOf(call)
//传入参数,直接去调用函数
function.Call(inValue)
}
//桥接函数,调用不同的函数
bridge(call1,1,2)
bridge(call2,1,2,"test2")
}
type user struct {
UserId string
Name string
}
//实例化一个对象,并为该实例赋值
func TestRelectStructPtr(t *testing.T){
var (
model *user
st reflect.Type
elem reflect.Value
)
st = reflect.TypeOf(model) //获取类型 *user
t.Log("reflect.TypeOf",st.Kind().String()) //ptr
st = st.Elem() //st指向的类型
t.Log("reflect.TypeOf.Elem",st.Kind().String()) //struct
elem = reflect.New(st) //New返回一个Value类型值,该值持有一个指向类型为type的新申请的零值指针
t.Log("reflect.New",elem.Kind().String()) //ptr
t.Log("reflect.New.Elem",elem.Elem().Kind().String()) //reflect.New.Elem struct
//model就是创建的user结构体变量(实例)
model = elem.Interface().(*user) //model是*user 它的指向和elem是一样的
elem =elem.Elem() //取得elem指向的值
elem.FieldByName("UserId").SetString("123456") //赋值
elem.FieldByName("Name").SetString("jack")
t.Log("model model.Name",model,model.Name) //model model.Name &{123456 jack} jack
}
总结:
(1.)反射的应用有适配器定义,结构体创建和对结构体字段进行操作
----------------------------------【喜欢打赏】-------------------------------------------
小主,辛苦啦!文章棒棒哒,赏杯咖啡吧...

----------------------------------【喜欢打赏】-------------------------------------------
golang 反射应用(二)的更多相关文章
- golang反射初试
golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST. t := reflect.TypeOf(obj) 使用TypeOf( ...
- Golang笔记(二)面向对象的设计
Golang笔记(二)面向对象的设计 Golang本质还是面向过程的语言,但它实现了一些OOP的特性,包括抽象.封装.继承和多态. 抽象和封装 Golang和C语言一样以struct为数据结构核心,不 ...
- Golang反射机制
Go反射机制:在编译不知道类型的情况下,可更新变量.在运行时查看值.调用方法以及直接对它们的布局进行操作. 为什么使用反射 有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口, ...
- [golang]反射的用处--代码自动生成
背景: go语言处理db.json的时候,具体代码的变量定义和db字段.json输出的时候可能不一样. 这个时候,我们需要用tag的方式来进行定义. 例如: type MyStruct struct ...
- golang 反射
参考:|--http://blog.51cto.com/speakingbaicai/1707637 |--https://studygolang.com/articles/6324 反射是在gola ...
- GOLANG 反射法则
译自[blog.golang.org/laws-of-reflection] 在计算机中, 反射是程序通过类型,检测到它自己的结构能力:是一种元编程程:也是一个具大的混淆点 在本文中,我们将通过解释反 ...
- golang反射
要点 1.变量 2.反射 3.结构体反射 4.反射总结以及应用场景 一.变量介绍 1.变量的内在机制 A.类型信息,这部分是元信息,是预定义好的 B.值类型,这部分是程序运行过程中,动态改变的 var ...
- 详解C#特性和反射(二)
使用反射(Reflection)使得程序在运行过程中可以动态的获取对象或类型的类型信息,然后调用该类型的方法和构造函数,或访问和修改该类型的字段和属性:可以通过晚期绑定技术动态的创建类型的实例:可以获 ...
- Java从零开始学四十一(反射简述二)
一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方 ...
随机推荐
- Gravitee.io 架构
Gravitee.io 官方文档提供了几张架构图,通过图我们可以有一个整体的认识. 全局架构 平台架构 参考资料 https://docs.gravitee.io/apim_overview_arch ...
- PHP用curl发送get post put delete patch请求
function getUrl($url){ $headerArray = array("Content-type:application/json;", "Accept ...
- 新版vue-cli输入本地ip不能访问,只能用localhost才可以访问?
问:新版vue-cli输入本地ip不能访问,只能用localhost才可以访问? 答:修改config/index.js配置,将host: 'localhost',改为host: '0.0.0.0', ...
- spring4与mongodb的集成
新项目的辅助系统,需要用到mongo系统,今天再次将其使用环境进行了操作搭建.还是遇到一些问题,毕竟之前使用的场景和现在的不同.版本也不一样了. 本次使用的环境: mongo:3.4.4版本 OS: ...
- JavaScript跟踪-Piwik
1.先决条件:使用新版本的JavaScript跟踪代码 2.JavaScript跟踪代码的功能 (1)自定义在Piwik中显示的页面名称 (2)手动触发目标转化 (3)考虑一个主机的“别名”,不将这个 ...
- NAND FLASH控制器
一.nand flash访问原理 地址空间概念 nand的编址 nand命令 命令,地址,数据 使用S3C2440的nand flash控制器访问nand flash 前几个编译出来的文件都小于4k ...
- 了解ARM+Android
第一部分 认识ARM,方案商,GPU , 芯片 1.1 ARM ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能.廉价.耗能低的RISC处理器.相关 ...
- codeblocks “can't find compiler executable in yourconfigured search ……”
新安装的codeblocks 16.01,安装后打开提示如下,没法用..原因是编译器并没有找对自己安装的 mingw 的安装位置. 解决办法:如下图点击 Auto-detect 之后,会看到位置信息变 ...
- windows服务命令 转载
OnCustomCommand executes when the Service Control Manager (SCM) passes a custom command to the servi ...
- 实现java随机数Random的几招
一,在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,可以产生随机整数.随机float.随机double,随机long,这个也是我们经常用的一个 ...