反射基本介绍和示意图 | 学习笔记

简介: 快速学习反射基本介绍和示意图

开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程反射基本介绍和示意图】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9766


反射基本介绍和示意图

 

内容介绍

一、基本介绍

二、引入“reflect

 

一、基本介绍

1.反射可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind)

2.如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)

3.通过反射,可以修改变量的值,可以调用关联的方法。

4.使用反射,需要 import(“reflect”)

package reflect

import "reflect"

reflect 包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型 interfacef)保存一个值,通过调用 TypeOf 获取其动态类型信息,该函数返回一个 Type 类型值。调用 ValueO 函数返回一个 Value 类型值,该值代表运行时的数据。Zero 接受一个 Type 类型参数并返回一个代表该类型零值的 Value 类型值。

5. 示意图

image.png


二、反射的示意图

1.

var num int

var student Student

2.reflect.Type 类型

reflect.TypeOf()

reflect.ValueOf(v)

3.refiect.Value 类型

type Student {

Name string

Age int.

...

}

func (this Student) print(nint) {

//...

}

type Value

代码如下:

type Value struct

//内含隐或非导出字段

}

Value 为 go 值提供了反射接口。

不是所有 go 类型值的Value表示都使用所有方法。请参见每个方法的文档获取使用限制。在调用有分类限定的方法时,应先使用 Kind 方法获知该值的分类。调用该分类不支持的方法会导致运行时的 panic。

Value 类型的零值表示不持个值,零值的 isValid 方法调回 false,其 Kind 方法派回 Invalid,而 String 方法返回",所有其它方法都会 panic,绝大多数函数和方法都永远不返回 Value 零值,如果某个数/方法回了非法的 Value,它的文档必须显式的说明具体情况

如果某个 go 类型值可以安全的用于多线程并发操作,它的 Value 表示也可以安全的用于并发。

func ValueOf

代码如下

func valueOf(i interfacefl)) Value

ValueOf 医回一个初始化为接口保营的具体值的 Value,ValueOf(nil)返回 Value 零值。

func Zero

代码如下

func Zero(typ Type)Value

Zero 返回一个持有类型 typ 的零值的 Value。注意持有零值的 Value 和 Value 零值是两回事。Value 零值表示不持有任可值,例 Zero(TypeOf42))近回一个 Kind 为 int,值为0的 Value,Zero 的返回值不能设置也不会址。

func New

代码如下

func New(typ Type)Value

func Neu(typ Type)Value

New 回一个 Value 型值,该值持有一个指向类型为 typ 的新申请的值的指针,近回值的 Tvpe 为 PtrTo(typ)

func NewAt

代码如下

func Neuat(typ Type,p unsafe.Pointer)Value

NewAt 近回一个 Value 类型值,该值持有一个指向类型为 typ、地址为 p 的值的指针。

func indirect

代码如下

func Indirect(v Value)Value

返回持有 V 持有的描针指向的值的 Value。如果 v 持有 nil 针,会返回 Value 零值;如果 v 不持有指针,会返回 V。

func MakeSlice

type Type

type Type interface {

// kind 返回该接口的具体分卖

Kind()Kind

//Name 返回该类型在白身包内的类型名:如果是未命名类型会返回""

Name() string

//PkgPath 返回类型的包路径:即明确指定包的 import 路径:如"encoding/base64

//如类型内建类型(stringerror)或未命名类型(*T,struct{},[ ]int),会返""

PkaPath()string

//返回类型的字符串表示该字符串可能会使用短包名(如用 base54代替"encoding/base64”)

//也不保证每个类型的字符串表示不同。如果要比较两个类型是否相等,请直接用 Type 类型比较。

String() string

//返回要保存一个该类型的值需要多少字节:类unsafe.sizeof Size() uintptr

//返回当从内存中申请一个该类型值时,会对齐的字节

Align()int

// 返回当该类型作为结构体的字时,会对的字节数

Fieldalign() int

// 如果类型实现了 u 代表的接口:会返回真

Implerentsiu Tvpe) bool

// 如果类型的值可以直接值给 u 代表的类型:返回真

func (v Value) Bytes()]byte

func (v Value) String() string

func (v Value) Pointer() uintptr

func (v Value) InterfaceData()[2]uintptr

func (v Value) Slice(i,j int)Value

func (v Value) Slice3(ijk int) Value

func (v Value) Cap()int.func(v Value) Len()int

func (v Value) Index(i int) Value

func (v Value) Mapindex(key Value) Value

func(v Value) MapKeys()IValue.func (v Value) NumField()int func (v Value) Field(i int) Value

func (vValue) FieldByindex(index [] int)value

func (v Value) FieldByName(name string) Value

func (v Value) FieldByNameFunc(match func(string)bool) Value

func (v Value) Recv((xValue, ok bool)

func (v Value) TryRecv()(x Value, ok bool)

func(v Value) Send(x Value)

func (vValue) TrySend(xValue)bool

func (v Value) Close()

func (v Value) Call(in (Value)IValue

func (v Value) CallSlice(in iValue)Value

func(v Value) NumMethod))int

func (vValue)Method int) Value

相关文章
|
5月前
|
开发者
简述函数和框架的区别
简述函数和框架的区别
36 1
|
6月前
|
缓存
KVCache原理简述
KVCache原理简述
193 0
|
4月前
|
存储 设计模式 Java
Java面试题:解释代理模式的概念,并举例说明其应用场景。
Java面试题:解释代理模式的概念,并举例说明其应用场景。
58 0
|
存储 算法 安全
Java集合概述和总结分析与图示
Java集合概述和总结分析与图示
67 0
|
存储 算法 Java
Java集合重点知识详解——优点以及内部继承关系
Java集合重点知识详解——优点以及内部继承关系
96 0
|
设计模式 算法 程序员
java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】
java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】
341 0
|
编译器
十二章-类设计回顾-重要知识点
十二章-类设计回顾-重要知识点
83 0
|
C语言 C++
C++中的类简要介绍
C++中的类简要介绍
85 0
|
Java 程序员 编译器
接口的基本介绍
接口的基本介绍
接口的基本介绍
|
存储 Java 程序员
Java面向对象基础4——内存图
Java面向对象基础4——内存图
148 0
Java面向对象基础4——内存图