Go语言反射入门 | 青训营笔记

77 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记

引言

首先我们先看一下反射的定义

反射是指在程序运行期对程序本身进行访问和修改的能力,程序在编译时变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时程序无法获取自身的信息。

Go语言的反射是一种机制在运行时更新和检查变量的值、调用变量的方法和变量支持的内在操作(即使在编译时并不知道这些变量的具体类型),反射可以让我们将类型本身作为第一类的值类型处理。类似的Java、C#等语言也都支持类似的完整的反射功能。

Go语言中使用反射需要引入reflect包的支持,如下引入

package main

import (
  "fmt"
  "reflect"
)

快速入门

reflect包中提供了两个重要的类型:type, value。type即一个变量的类型,value为一个变量的值。以及两个重要的方法去获取他们,分别是reflect.TypeOf, reflect.ValueOf。

我们运用反射时主要关注的是一个变量的类型,所以这里我们主要在考虑type和reflect.TypeOf

Type对象

Type中主要包括两个重要的方法,一个是Name(),一个是Kind(),分别获取一个变量的类型和种类。那么问题来了,类型和种类有什么区别吗?

对于一般的系统原生数据类型而言,Name就是我们预期的对象的变量的类型(此时Kind也与Name相同都是变量的类型),而对于结构体(枚举)的变量而言,不管他是那种类型的结构体(枚举),在这里Name()出来的都是struct(Enum)类型,显然不符合我们的预期,所以reflect提供了Kind()方法进行细分类型的展示。