Go语言中的反射是什么

什么是反射

反射,嗯…,就是反着的意思呗,就是把东西反过来。

比如这样的一个很简单的代码。

var a int = 3 fmt.Println(a)

我们当然知道a变量是int类型,但是反过来想,程序是怎么知道a是int类型呢???

这时候,就需要用到反射了。

示例代码

v := reflect.TypeOf(a) fmt.Println(v)

两次代码综合一块执行结果

Go语言中的反射是什么

第二次的第2行代码,成功的将变量a还原出了int类型。

什么???你为我有什么用???,嗯。。。实话实说,用的不是太多,但是必须要会的。

反射(reflect包)

在Go中,任何变量,都有具体类型和具体值,就像var a int = 3,具体类型就是int,具体值就是3。

所以,变量的具体类型归属在reflect.Type,变量的具体值归属在reflect.Value。

并且Go的提供了

  • reflect.TypeOf获取具体类型。

  • reflect.ValueOf获取具体值。

TypeOf

TypeOf方法可以获取变量的具体类型。

有一个这样的需求,定义一个函数,可以接收任意类型数据,通过反射打印变量类型。

示例代码

函数

func reflectType(x interface{}) {     v := reflect.TypeOf(x)     fmt.Printf("你传入的变量类型是:%v\n",v) }

main

func main() {     var a int = 666     var b float64 = 3.14     var c string = "hello world"     var d [3]int = [3]int{1,2,6}     var e []int = []int{1,2,6,88}     var f map[string]interface{} = map[string]interface{}{         "Name":"张三",         "Age":18, }     reflectType(a)     reflectType(b)     reflectType(c)     reflectType(d)     reflectType(e)     reflectType(f) }

执行结果

Go语言中的反射是什么

通过reflect.TypeOf方法,完美解决上述需求。

TypeOf 的Name和Kind

这个是啥意思呢??这个在结构体中比较好体现。

简答来说就是TypeOf返回的太笼统了,还有更加细化的类型,通过这俩属性获取。

示例代码

函数

func reflectType(x interface{}) { v := reflect.TypeOf(x) fmt.Printf("你传入的变量类型是:%v | Name:%v | Kind:%v\n", v, v.Name(), v.Kind()) }

结构体

type Student struct {     Name string     Age int }

main

func main() {     var a int     var b *int     var c []int     var d map[string]interface{}     var e Student     reflectType(a)     reflectType(b)     reflectType(c)     reflectType(d)     reflectType(e) }

执行结果

Go语言中的反射是什么

总结

经过对比,会发现几个特殊问题。

如果变量是指针类型,Name为空,Kind是ptr。

如果变量是引用类型(切片和map)类型,Name为空,只有Kind。

如果变量是结构体,Name是结构体名,Kind是struct。

ValueOf

TypeOf只能反过来获取变量的具体类型,但是并不能获取具体值,这就有点不太厚道了。

所以ValueOf就来解决这个问题了,但是ValueOf牛叉的是,它里面还包括了变量类型。

注:ValueOf和TypeOf的Kind属性返回内容是一摸一样的。

需求:定义一个函数,可以接收任意类型,通过反射得出变量类型和变量值。

函数

func reflectType(x interface{}) {     v := reflect.ValueOf(x)     k := v.Kind()     switch k {     case reflect.Int:         fmt.Printf("我是Int类型,我的值是%v\n",v.Int())     case reflect.Slice:         fmt.Printf("我是切片类型,我的值是%v\n",v.Slice(1,2))     case reflect.Map:         fmt.Printf("我是切片类型,我的值是%v\n",v.MapKeys())     //case :可以继续case下去   } }

main

func main() {   var a int = 1   var c []int = []int{1, 5, 7, 19}   var d map[string]interface{} = map[string]interface{}{     "Name": "你好",     "Age":  18,   }   var e Student   reflectType(a)    reflectType(c)   reflectType(d)   reflectType(e) }

执行结果

Go语言中的反射是什么

通过反射设置值

反射还有一个用途,就是动态的修改变量值,可能你暂时体会不到,但是语法还是要学的。

通过反射设置值,需要用到Elem方法,并且传入的必须是指针。

示例代码

函数

func reflectSetValue(x interface{}) {   v := reflect.ValueOf(x)   //kind也必须是Elem调用   var k = v.Elem().Kind()   switch k {   case reflect.Int:     //反射修改必须通过Elem     v.Elem().SetInt(200)   } }

main

func main() {   var a int = 10   fmt.Printf("a的值:%v\n", a)   //反射修改值传入的必须是地址   reflectSetValue(&a)   fmt.Printf("a的值:%v\n", a) }

执行结果

Go语言中的反射是什么

原创文章,作者:IQNLK,如若转载,请注明出处:https://www.beidanyezhu.com/a/28861.html

(0)
IQNLK的头像IQNLK
上一篇 2025-01-27
下一篇 2025-02-01

相关推荐

  • Go语言与鸭子类型的关系是什么

    Go语言与鸭子类型的关系   先直接来看维基百科里的定义:   If it looks like a duck, swims like a duck, and quacks lik…

  • Go语言的重要性

    一、Go 开发者 数量 & 所处地区 全球大约有 110 万名职业 Go 开发者(特指在工作中专门将 Go 作为主力编程语言的群体),如果把主要使用其他编程语言但同时兼职使…

    2025-02-05
  • Go语言中CGO怎么用

    1. Go语言调用C函数例子: package main   // // 引用的C头文件需要在注释中声明,紧接着注释需要有import &q…

    2025-02-05
  • Go语言能否取代Linux脚本

      在Cloudflare的人们都非常喜欢Go语言。我们在许多内部软件项目以及更大的管道系统中使用它。但是,我们能否进入下一个层次并将其用作我们最喜欢的操作系统Linux的脚本语言…

  • 什么是Go语言的字符串

      一个Go语言字符串是一个任意字节的常量序列。 Go语言字符串与其他语言不同点   Go语言字符串与其他语言(Java,C,Python)字符串的不同点Go语言中字符串的字节使用…

  • 为什么Go语言能够成功

      常言道,历史不会重演,但总会惊人的相似。   如果您想创建一种编程语言,多向那些有经验的人士学习,他们有很多可取之处。在《GoTime》第100期节目中,两位Go语言的创造者R…

  • go语言中函数与方法是什么

      如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的。   package math   func Sin(x float64) float //implemented …

  • Go的基础之数组是什么

    Go基础之数组   Array(数组)   Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化   var数组变量名[元素数量]T   //定义一个长度为…

  • GO语言的类型有哪些

    1、值的类型给编译器提供两部分信息:一是,需要分配多少内存给这个值(即值的规模);二是这段内存表示什么。 2、用户自定义类型有两种方法。一是使用关键字 struct ,来创建一个结…

    2025-02-05
  • 如何安装和使用Go语言集成开发环境的VS Code

    目录 Go语言集成开发环境之VS Code安装使用 下载与安装 安装中文简体插件 安装Go开发扩展 变更编辑器主题 安装Go语言开发工具包 配置VSCode开启自动保存 配置代码片…

    2025-02-05

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部