开发者学堂课程【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)
}
图例如下:
//变量通过传递参数交给一个空接口,空接口通过反射的一个函数叫 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)