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 反射应用(二)的更多相关文章

  1. golang反射初试

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

  2. Golang笔记(二)面向对象的设计

    Golang笔记(二)面向对象的设计 Golang本质还是面向过程的语言,但它实现了一些OOP的特性,包括抽象.封装.继承和多态. 抽象和封装 Golang和C语言一样以struct为数据结构核心,不 ...

  3. Golang反射机制

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

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

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

  5. golang 反射

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

  6. GOLANG 反射法则

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

  7. golang反射

    要点 1.变量 2.反射 3.结构体反射 4.反射总结以及应用场景 一.变量介绍 1.变量的内在机制 A.类型信息,这部分是元信息,是预定义好的 B.值类型,这部分是程序运行过程中,动态改变的 var ...

  8. 详解C#特性和反射(二)

    使用反射(Reflection)使得程序在运行过程中可以动态的获取对象或类型的类型信息,然后调用该类型的方法和构造函数,或访问和修改该类型的字段和属性:可以通过晚期绑定技术动态的创建类型的实例:可以获 ...

  9. Java从零开始学四十一(反射简述二)

    一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方 ...

随机推荐

  1. day4 java消息中间件服务

    PS: 讲个故事,老王要给他的两个女儿讲故事,他要一个一个讲很费劲,后来他使用了微信公众号,让订阅微信公众号的人关注就减轻了负担. PS: 传统的如果一个用户进行登录,会调用分多的服务,如果没有消息中 ...

  2. 深入浅出理解 COOKIE MAPPING

    转载自:http://www.myttnn.com/digital-marketing/cookie-mapping-introduction/ 在RTB(实时竞价广告,Real-Time-Biddi ...

  3. 日志信息log

    #include<syslog.h> //建立一个到系统日志的连接 //ident参数指向字符串,syslog()输出的每条信息都会包含这个字符串,这个参数的取值通常是程序名 //log_ ...

  4. Collection接口中方法的使用

    Collection:集合的接口 1.Collection和ArrayList和List的关系 ArrayList      implement(实现)       List List        ...

  5. nightwatchjs 基于nodejs&& webdriver 协议的自动化测试&&持续集成框架

    nightwatchjs 是基于nodejs&& webdriver 协议的自动化测试&&持续集成框架 参考架构 参考资料 http://nightwatchjs.or ...

  6. 线性代数及其应用 (David C.Lay, Steven R.Lay 著)

    第1章 线性代数中的线性方程组 (已看) 介绍性实例 经济学与工程中的线性模型 1.1 线性方程组 1.2 行化简与阶梯形矩阵 1.3 向量方程 1.4 矩阵方程Ax=b 1.5 线性方程组的解集 1 ...

  7. 编写一个函数 reverse_string(char * string)实现:将参数字符串中的字符反向排列 。(递归实现)

    要求:不能使用C函数库中的字符串操作函数. 思路:在递归函数的调用时,先应该定义一个指针型char字符串.函数内部应先调用自己,在打印,这样才能保证字符串是从最后一个开始输出. #include< ...

  8. 开发 FastAdmin 时见识到 php opcache 厉害

    开发 FastAdmin 时见识到 php opcache 厉害 FastAdmin 的插件配置是写在 config.php 中的. 我在修改配置时发现加了空格,然后再重新打开配置页发现空格没有配置面 ...

  9. prop-types:该第三方库对组件的props中的变量进行类型检测

    利用prop-types第三方库对组件的props中的变量进行类型检测

  10. secureCRT 设置证书免密登陆

    1 第一步 2 第二步 3 第三步 4 第4 步 ,然后选择你的 私钥文件