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.)反射的应用有适配器定义,结构体创建和对结构体字段进行操作

原文地址:https://www.cnblogs.com/tomtellyou/p/10467260.html

时间: 2024-08-30 11:05:43

golang 反射应用(二)的相关文章

跟王老师学反射(二):Java类的加载、连接和初始化

跟王老师学反射(二):Java类的加载.连接和初始化 主讲教师:王少华   QQ群号:483773664 学习内容: 了解类的加载.连接和初始化 一.类的生命周期 当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程.一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直

golang反射初试

golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST. t := reflect.TypeOf(obj) 使用TypeOf()获取类型信息. v := reflect.ValueOf(obj) 使用ValueOf获取值信息 如果t是Array, Slice, Map, Chan或Pointer,可以继续继续使用Elem()方法获取其元素的更多信息. Elem(): 必须是Array, Slice, Map, Chan或

.net Reflection(反射)- 二

反射 Reflection 中访问方法 新建一个ClassLibrary类库: public class Student { public string Name { get; set; } public string School { get; set; } public int Sum(int a, int b) { return a + b; } public string GetName() { return "this is book" ; } } /// <summa

golang内存分配 (二)

源码基于go1.8rc3. 首先看看mheap的数据结构 // mheap本身只包含"free[]" and "large"数组 // 但其他的全局数据也在这里 // mheap 禁止从堆上创建,因包含的mSpanLists不能从堆上创建 type mheap struct { lock mutex free [_MaxMHeapList]mSpanList // free lists of given length freelarge mSpanList // f

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

背景: go语言处理db.json的时候,具体代码的变量定义和db字段.json输出的时候可能不一样. 这个时候,我们需要用tag的方式来进行定义. 例如: type MyStruct struct { Name string `json:"name"` MaxHeight int `json:"max_height"` } 如果字段或结构体非常多的话,有十几二十几个,就非常的麻烦. 因此,就利用golang的反射,做了一个小工具来自动生成,具体使用如下: //你的

golang学习笔记:golang 语法篇(二)

在语法篇(一)中学习了go中基本的数据类型.变量.常量等组成语言的基本要素,在这一节中将会学习如何将这些元素组织起来,最终写成可以执行的代码. 在这一部分包括: go中的流程控制语句: go中函数的用法: go特殊的错误处理方式: Golang中的流程控制语句 在具体编程的时候免不了需要使用一些特殊的语句实现某些功能,比如使用循环语句来进行迭代,使用选择语句控制程序的执行方式等.这些语句在任何一门程序设计语言 中都会有支持,golang中除了支持常用的循环,条件选择语句以外,还支持跳转语句,下面

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

一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方法 类型 描述 1 public static Class<?> forName(String className) throws ClassNotFoundException 普通 传入完整的“包.类”名称实例化Class对象 2 public Constructor[] getConstruc

初识反射之二

上一篇说了反射的三种方式.今天就第三种说一说Class.forName("这个类的全程").这个是动态加载.加载机制里面有一个动态加载和静态加载. 先说静态加载,就相当于万事俱备只欠东风型,怎么说呢?他会把你写的代码每个都检查一遍,都通过了才能进行运行. 动态加载就显得灵活一些,相当于吃自助,就是需要什么加载什么,其他不需要的哪怕出错,那先不管. 然后再说这个Class.forName("这个类的全称") ,它相当于把这个神仙对象弄出来了.可是当调用newstanc

golang 反射

转自:http://golanghome.com/post/546 自己在用Go写Web框架时,遇到要从接口中返回对象信息的技术问题.网上关于Go中接口反射的资料较少,所以自己学习了一段时间,特将结果与大家分享. 代码约定 import ( "fmt" "reflect" ) type boy struct { Name string age int } type human interface { SayName() SayAge() } func (this *