反射的相关函数和转换|学习笔记

简介: 快速学习反射的相关函数和转换

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程反射的相关函数和转换】学习笔记,与课程紧密联系,让用户快速学习知识。

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


反射的相关函数和转换

 

内容介绍

一、反射的应用场景

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

 

一、反射的应用场景

反射常见应用场景有以下两种

1.不知道接口调用哪个函数,根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射。例如以下这种桥接模式,比如我前面提出问题。

Func bridge(funcptr interface{},args…interface { } )

第一个参数 funcPtr 以接口的形式传入函数指针,函数参数 args 以可变参数的形式传入,bridge 函数中可以用反射来动态执行 funcPtr 函数。

2.对结构体序列化时,如果结构体有指定 tag,也会使用到反射生成对应的字符串。

代码如下:

package main import (

"fmt"

encoding/json)

type Monster struct {

Name string `json:"monsterName"

Age int json:"monsterAge"

Sal float64 `json:"monsterSal""

Sex string `json:"monsterSex"

}

func main(){

m :=Monster{

Name :“玉兔精", Age :20,

Sal :888.99,

Sex :"female"

}

data,:=json.Marshal(m)

fmt.Println("json result:", string(data))}

 

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

1.reflect.TypeOf(变量名),获取变量的类型,返回 reflect.Type 类型

2. reflect.ValueOf(变量名),获取变量的值,返回 reflect.Value 类型,reflect.Value 是一个结构体类型。【看文档】,通过 reflect.Value,可以获取到关于该变量的很多信息。

type Value

代码如下:

type Value struct {

//内含或导出字段

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

func(v Value) isValid(bool

func(v Value)IsNiObool

func(v Value)Kind()Kind

func(v Value)Type()Type

func(v Value) Convert(t Type) Value

func(v Value)ElemOValue

func(v Value)Bool()bool

func(v Value)int0int64

func(v Value) Overfiowint(x int64)bool

func (vValue)UintOuint64

funcaalue)Ovetiowuint(x int64)bool

func(v Value) Float0floa164

func(v Value) OverflowFloat(x fioat64) bool

func(v Value)Complex0complex128

func(v Value) OverfiowComplex(x complex128)bool

3.变量、interface{ } 和 reflect.Value 是可以相互转换的,这点在实际开发中,会经常使用到。

变量interface{} reflect.value 的转换 .pn

变量、interface{} 和 reflectValue 是可以相互转换的,在使用反射的过程中,通常的方式是

var student stu

var num int

//专门用于做反射

func test(b interface{}) {

//1.如何将Interface))转成reflect.Value

rVal :=reflect.ValueOf(b)

//2.如何将 reflect.Value->interface()

iVal:=rVal.interface()

//3.如何将inteface)转成原来的变量类型使用类型断言 v:=iVal.(Stu)

}

图例如下:

image.png//变量通过传递参数交给一个空接口,空接口通过反射的一个函数叫 reflect.vale{},拿到了这个反射的类型 vale。通过反射的 vale 类型,可以再通过 v.infect(),再返回去变成接口。使用断言,可以使它们几个函数之间随意的进行一个切换。

资源库“value”

func(Value)Interface

代码如下:

func (v Value) Interface()(i interface{ })

本方法返回 v 当前持有的值(表示为/保管在 interfacef )类型),等价于:

代码如下:

var i interface{} = (v's underlying value)

相关文章
|
6月前
通过反射获取方法返回的类型
通过反射获取方法返回的类型
|
Java
反射的用法以及介绍
反射的用法以及介绍
53 0
|
3月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
|
监控 Java 容器
字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
在上一篇 「Helloworld」 中,我们初步尝试使用了 Javassist字节编程的方式,来创建我们的方法体并通过反射调用运行了结果。大致了解到创建在使用字节码编程的时候基本离不开三个核心类;ClassPool、CtClass、CtMethod,它们分别管理着对象容器、类和方法。但是我们还少用一样就是字段;CtFields,在这一章节中我们不止会使用字段,还会创建多个不同入参类型和返回值的学习。
391 0
字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
|
Java 编译器
第8篇:学习 Java 中的方法(方法的定义、可变参数、参数的传递问题、方法重载、方法签名)通过官方教程
原始参数(eg:int 或 double)通过 value 传递给方法。这意味着对参数值的任何更改仅存在于该方法的作用域内。当方法返回后,栈帧销毁后,参数消失后,对它们的任何更改都将无效。
218 0
第8篇:学习 Java 中的方法(方法的定义、可变参数、参数的传递问题、方法重载、方法签名)通过官方教程
|
网络协议 编译器 测试技术
方法和函数区别说明|学习笔记
快速学习方法和函数区别说明
C#反射与特性(四 实例化类型
C#反射与特性(四 实例化类型
280 0
C#反射与特性(四 实例化类型
|
存储 Java
Java 技术篇-借助自定义对象实现函数返回多个不同类型的值实例演示
Java 技术篇-借助自定义对象实现函数返回多个不同类型的值实例演示
441 0
Java 技术篇-借助自定义对象实现函数返回多个不同类型的值实例演示
|
Java 开发者
反射调用普通方法|学习笔记
快速学习反射调用普通方法
114 0
反射调用普通方法|学习笔记
|
C# 索引
C#反射与特性(八):反射操作的示例大全
C#反射与特性(八):反射操作的示例大全
343 0