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

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

开发者学堂课程【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)

相关文章
|
5月前
通过反射获取方法返回的类型
通过反射获取方法返回的类型
|
12月前
|
Java
反射的用法以及介绍
反射的用法以及介绍
50 0
|
2月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
C++转换构造函数以及类型转换函数
🐰转换构造函数 🐰类型转换函数
|
Java 数据处理 数据库
反射到底有什么作用,能帮我们干些什么呢?
反射到底有什么作用,能帮我们干些什么呢?
C#反射与特性(四 实例化类型
C#反射与特性(四 实例化类型
275 0
C#反射与特性(四 实例化类型
|
C# 索引
C#反射与特性(八):反射操作的示例大全
C#反射与特性(八):反射操作的示例大全
331 0
|
Java 开发者
反射调用普通方法|学习笔记
快速学习反射调用普通方法
111 0
反射调用普通方法|学习笔记
|
Java 开发者
反射与类操作(反射调用构造)|学习笔记
快速学习 反射与类操作(反射调用构造)
118 0