第27章:反射

您所在的位置:网站首页 golang反射获取package 第27章:反射

第27章:反射

2024-06-14 12:33| 来源: 网络整理| 查看: 265

反射反射概述reflect.Type类型和值reflect.Value类型和值

第27章:反射



反射

Go是一门具有良好反射支持的静态语言。 本文将解释reflect标准库包中提供的反射功能。

在阅读本剩下的部分之前,最好先阅读Go类型系统概述(第14章)和接口(第23章)两篇文章。

反射概述

Go中提供的反射功能带来了很多动态特性。 很多标准库,比如fmt和很多encoding包,均十分依赖于反射机制。

我们可以通过reflect库包中Type和Value两个类型提供的功能来观察不同的Go值。 本文下面的内容将介绍如何使用这两个类型。

Go反射机制设计的目标之一是任何非反射操作都可以通过反射机制来完成。 由于各种各样的原因,此目标并没有得到100%的实现。 但是,目前大部分的非反射操作都可以通过反射机制来完成。 另一方面,通过反射,我们也可以完成一些使用非反射操作不可能完成的操作。 不能或者只能通过反射完成的操作将在下面的讲解中提及。

reflect.Type类型和值

通过调用reflect.TypeOf函数,我们可以从一个任何非接口类型的值创建一个reflect.Type值。 此reflect.Type值表示着此非接口值的类型。通过此值,我们可以得到很多此非接口类型的信息。 当然,我们也可以将一个接口值传递给一个reflect.TypeOf函数调用,但是此调用将返回一个表示着此接口值的动态类型的reflect.Type值。 实际上,reflect.TypeOf函数的唯一参数的类型为interface{}, reflect.TypeOf函数将总是返回一个表示着此唯一接口参数值的动态类型的reflect.Type值。 那如何得到一个表示着某个接口类型的reflect.Type值呢? 我们必须通过下面将要介绍的一些间接途径来达到这一目的。

类型reflect.Type为一个接口类型,它指定了若干方法。 通过这些方法,我们能够观察到一个reflect.Type值所表示的Go类型的各种信息。 这些方法中的有些适用于所有种类的类型,有些只适用于一种或几种类型。 通过不合适的reflect.Type属主值调用某个方法将在运行时产生一个恐慌。 请阅读reflect代码库中各个方法的文档来获取如何正确地使用这些方法。

一个例子:

package mainimport "fmt"import "reflect"func main() { type A = [16]int16 var c


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3