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. WCF、WebAPI、WCFREST、WebService 、RPC、HTTP 概念解释

    在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下,你有很多的选择来构建一个HTTP Services.我分享一下我对 ...

  2. Akka探索第一个例子by fsharp 1

    如何构建一套分布式程序一直是我想知道的问题. Akka就是一套用来开发分布式系统的开发库.当然开发分布式系统只是它的能力之一.除此之外高度抽象的并行运算能力,轻量级的消息系统,容错能力都是该库的特点. ...

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

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

  4. Lombok使用与问题

    前言 想想已经工作了一年,工作中遇到的问题一直没有记录下来,以后遇到相同的问题可能还需要花费很多的时间,因此打算记录一下博客.方便以后自己的复习和问题查找 刚好最近项目引入了Lombok,刚好从现在起 ...

  5. 基于springmvc开发注解式ip拦截器

    一.注解类 @Documented @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) ...

  6. LotusScript_导出数据库路径和名称

    对服务器有些数据库需要建立复本,新建拷贝,修改权限(ACL),或是修改数据库标识符(ID)需要找到这些数据库.这个方法是导出指定服务器上所有数据库的路径,数据库名,标识符等信息,导出后对Excel表格 ...

  7. 【起航计划 005】2015 起航计划 Android APIDemo的魔鬼步伐 04 App->Activity->Custom Dialog Dialog形式的Activity,Theme的使用,Shape的使用

    App->Activity->Custom Dialog 例子使用Activity 来实现自定义对话框 类CustomDialogActivity本身无任何特别之处.关键的一点是其在And ...

  8. Ubuntu18.04中使用中文输入法

    如何在ubuntu18.04中设置使用中文输入法 ubuntu 在最新的版本中已经可以不用用户自己单独去下载中文输入法使用了,本次使用为 ubuntu18.04LTS版本(登陆是界面选择的是ubunt ...

  9. Spring Cloud程序报错总结

    1.com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: 原因如下: 在默认设置下,Eureka服务 ...

  10. 花3分钟了解下C/C++中的函数可变参简单实现

    1.可变参函数的原理 C/C++函数的参数是存放在栈区的,并且参数的入栈是从参数的右边开始,即最后一个参数先入栈,而第一个参数最后才入栈,所以,根据栈的后进先出性质,函数总能找到第一个参数.所以,可变 ...