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

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

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

相关文章
|
Java
反射的用法以及介绍
反射的用法以及介绍
68 0
|
存储 编译器 C++
C++中的转换构造函数
在 C/C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: int a = 6; a = 7.5 + a; 编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换为 double 类型,然后与 7.5 相加,得到和为 13.5。在向整型变量 a 赋值时,将 13.5 转换为整数 13,然后赋给 a。整个过程中,我们并没有告诉编译器如何去做,编译器使用内置的规则完成数据类型的转换。强制类型转换示例: int n = 100
119 0
|
4月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
167 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
6月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
|
9月前
|
Rust Java Serverless
函数与方法的区别
函数与方法的区别,当然是有区别。 不管是java、rust还是go,他们都是不一样的。
76 1
|
9月前
|
JavaScript 前端开发 Java
函数和方法有区别吗?
函数和方法有区别吗?
122 0
C++转换构造函数以及类型转换函数
🐰转换构造函数 🐰类型转换函数
|
算法 C++ iOS开发
C++ 基础复习系列1(输入输出类、调用数学函数类)
C++ 基础复习系列1(输入输出类、调用数学函数类)
C++ 基础复习系列1(输入输出类、调用数学函数类)
1、原始类型与引用类型(区别)
1、原始类型与引用类型(区别)
158 0