golang反射

Posted binbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang反射相关的知识,希望对你有一定的参考价值。

一、基本介绍

  1. 反射可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind)
  2. 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)
  3. 通过反射,可以修改变量的值,可以调用关联的方法
  4. 使用反射,需要import("reflect")

二、反射重要的函数和概念

  1. reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型
  2. reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型reflect.Value 是一个结构体类型,通过reflect.Value,可以获取到关于该变量的很多信息。
  3. 变量、interface{}和reflect.Value是可以相互转换的,这在实际开发中,经常用到
var student Student
var number int
//专门做反射
func test(b interface{}) {
    // 1.如何将interface{} 转成reflect.Value
    rval = reflect.ValueOf(b)
    // 2.如何将reflect.ValueOf转为interface{}
    iVal := rVal.Interface{}
    // 3.如何将interface{}转成原来的变量类型,使用类型断言即可
    v := iVal.(Student)
}

三、常量

  • 常量使用const修饰
  • 常量在定义的时候,必须初始化
  • 常量不能修改
  • 常量只能修饰bool、数值类型(int、float系列)、string类型
  • 语法:const identifier [type] = value

四、反射注意事项和细节说明

  1. reflect.Value.Kind,获取变量的类别,返回的是一个常量
  2. Type是类型,Kind是类别,Type和Kind可能相同也可能不同比如:var number int 的Type和Kind都是int,比如:var stu Student stu的Type是包名.Student,Kind是struct
  3. 通过反射可以让变量在interface{}和Reflect.Value之间相互转换,变量<---->interface{}<---->reflect.Value
  4. 使用反射的方式获取变量的值(并返回相应的类型),要求数据类型匹配,比如x是int,那么就应该使用reflect.Value(x).Int(),而不能使用其他
  5. 通过反射来修改变量,注意当使用Setxxx方法来设置需要通过对应的指针类型来完成,同事需要使用到reflect.Value.Elem()方法

以上是关于golang反射的主要内容,如果未能解决你的问题,请参考以下文章

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

golang代码片段(摘抄)

java 反射代码片段

GoLang - 有没有办法分析使用反射的代码的内存使用情况?

代码片段 - Golang 实现简单的 Web 服务器

代码片段 - Golang 实现集合操作