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. DEDECMS v5.7 完美实现导航条下拉二级菜单

    一.引言 好多人都问,织梦的下拉导航怎么做呢?其实很简单!即使你对代码一点也不熟悉,没关系! 按照我的步骤走!记住一步也不能错哦! 二.实现过程 1.首先: 将下面这段代码贴到templets\def ...

  2. [转]在离线环境中发布.NET Core至Windows Server 2008

    本文转自:http://www.cnblogs.com/durow/p/5765145.html 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面 ...

  3. SpringMVC 的初始化参数绑定

    初始化参数绑定:日期格式 一:首先我们先做一种日期格式的绑定,配置初始化参数绑定和自定义类型转换有着异曲同工之妙 配置步骤如下: 1.我们首先配置applicationContext.xml,进行扫描 ...

  4. 浅谈windows.onload()与$(document).ready()

    浏览器加载完DOM后,会通过javascript为DOM元素添加事件,在javascript中,通常使用window.onload()方法. 在jquery中,则使用$(document).ready ...

  5. 简简单单谈WCF

    另一个系统去访问另一个系统,就是需要使用到分布式通讯咯.. 1. webService   .netfromwork3.5中存在 2. webapi 3. Wcf    scop通讯协议 以上三种都是 ...

  6. Spring自定义注解配置切面实现日志记录

    一: spring-mvc.xml: <!--配置日志切面 start,必须与mvc配置在同一个配置文件,否则无法切入Controller层--><!-- 声明自动为spring容器 ...

  7. python--Time(时间)模块

    要使用一个模块,首先要把模块导入进来 import time 我们先把这一篇文章需要用的模块导入进来 首先说一下time模块,time模块中的函数 --sleep:休眠指定的秒数(可以是小数) imp ...

  8. JavaScript平台Platypi悄然登场

    几个月前,一个新的JavaScript平台Platypi悄然诞生.它为开发者提供的不仅仅是一套标准的MVC框架而已,由于它是基于TypeScript构建的,因此对开发者而言在熟悉之中透露出与众不同的感 ...

  9. centos6.5 网卡配置

    家里用的电脑是电信拨号的 所以用不了桥接模式 改用nat vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" HW ...

  10. selenium找不到元素

    1.页面元素处于不显示状态时,找不元素.必须使元素处于显示状态.使用js 或者 元素的点击事件等方式可以实现. " src="index.php?m=Index&a=Men ...