Go反射机制:在编译不知道类型的情况下,可更新变量、在运行时查看值、调用方法以及直接对它们的布局进行操作。

为什么使用反射

有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口,也有可能布局未知,也有可能该类型在程序设计时不存在。

当无法透视一个未知类型的布局时,这段代码就无法继续,所以引入反射机制。

reflect.Type与reflect.Value

Golang反射机制提供两种类型:Type和Value。

Type是一个接口,其中提供很多方法,能够识别类型以及透视类型的组成部分。Value可以包含一个任意类型的值。

reflect.TypeOf

TypeOf函数可以接受任何的interface{}参数,并且把接口中的动态类型以reflect.Type形式返回。TypeOf返回的是实际类型而非接口类型。例如:

  • var w io.Writer = os.Stdout
    fmt.Println(reflect.TypeOf(w)) // os.File

reflect.ValueOf

ValueOf函数接受任意的interface{}并将接口的动态值以reflect.Value的形式返回。

  • type User struct {
    Name string
    Age int
    } u := User{"Mike", 32}
    v := reflect.ValueOf(u)
    fmt.Println(v) // {Mike, 32}

reflect.Type

Type常用方法整理如下:

  • Kind() Kind 获取底层类型

    var w io.Writer = os.Stdout
    fmt.Println(reflect.TypeOf(w)) // os.File
    fmt.Println(reflect.TypeOf(w).Kind()) // struct
  • NumField() int 获取结构类型的字段数量,可用于遍历结构

  • Field(i int) StructField 通过下标i获得某一字段项

    type User struct {
    Name string
    Age int
    } u := User{"Mike", 32}
    t := reflect.TypeOf(u) for i := 0; i < t.NumField(); i++ {
    fmt.Println(t.Field(i).Name)
    }
  • NumMethod() 获得类型的方法集中被导出方法的数量

    for i := 0; i < t.NumMethod(); i++ {
    fmt.Println(t.Method(i).Name)
    }

reflect.Value

Value常用方法整理如下:

  • func (v Value) Interface() (i interface{}) 以 interface{} 形式返回v的当前值

    type User struct {
    Name string
    Age int
    } u := User{"Mike", 32}
    v := reflect.ValueOf(u)
    fmt.Println(v.Interface.(User)) // {Mike, 32}
  • func (v Value) Kind() Kind 返回v的底层类型

    fmt.Println(v.Kind())                       // struct

Type和Value相互转换图示

Golang反射机制的更多相关文章

  1. golang 反射

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

  2. golang 反射中调用方法

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

  3. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  4. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  5. NPOI操作EXCEL(四)——反射机制批量导出excel文件

    前面我们已经实现了反射机制进行excel表格数据的解析,既然有上传就得有下载,我们再来写一个通用的导出方法,利用反射机制实现对系统所有数据列表的筛选结果导出excel功能. 我们来构想一下这样一个画面 ...

  6. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  7. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  8. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  9. c#反射机制

    一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...

随机推荐

  1. Ajax原理实现

    jQuery的ajax实现原理: // 1.创建一个XMLHttpRequest对象 var xhr = new XMLHttpRequest(); // 2.打开请求 xhr.open('METHO ...

  2. Spring boot-(2) Spring Boot使用

    1. 构建系统 (1) 使用maven构建 1) 从Starter Parent继承 在项目中配置继承spring-boot-starter-parent,可以进行如下设置: <!-- Inhe ...

  3. poj 3107 删点最大分支最小

    http://poj.org/problem?id=3107 这实际上就是找重心,在之前有做过:http://www.cnblogs.com/qlky/p/5780933.html #include ...

  4. Chrome拷贝插件的对比 zeroclipboard和clipboard插件

    1.zeroclipboard插件 实现原理:Zero Clipboard 利用 Flash 进行复制,用了一个透明的 Flash ,让其漂浮在按钮之上,这样其实点击的不是按钮而是 Flash ,也就 ...

  5. sass-基础

    导入: sass的导入(@import)规则和CSS的有所不同,编译时会将@import的scss文件合并进来只生成一个CSS文件. 但是如果你在sass文件中导入css文件如@import 'res ...

  6. Android 实现朋友圈有图片和视频

    最近开发比较烦,这个作为我第一篇博客吧. 效果就是图上的样子. 首先是布局文件,没什么就是一个RecycleView <android.support.v7.widget.RecyclerVie ...

  7. Mahara-16.10 (Ubuntu 16.04)

    平台: Ubuntu 类型: 虚拟机镜像 软件包: mahara-16.10 commercial education elearning mahara open source 服务优惠价: 按服务商 ...

  8. VM(xp系统下用虚拟机安装win8 提示 :units specified don't exist, SHSUCDX can't install)解决方法

    改成IDE的模式

  9. COGS 146. [USACO Jan08] 贝茜的晨练计划

    ★☆   输入文件:cowrun.in   输出文件:cowrun.out   简单对比时间限制:1 s   内存限制:32 MB 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运 ...

  10. Linux 命令后台运行

    写这个随笔主要是每次Deepin用shadowsocks的时候总需要命令行启动,然后一个终端就一直开着总是点错了就给关了. (不知道为什么我的Deepin的shadowsocks-qt5总是连接不上的 ...