广告
返回顶部
首页 > 资讯 > 精选 >Go语言中的反射怎么用
  • 315
分享到

Go语言中的反射怎么用

2023-06-25 15:06:18 315人浏览 八月长安
摘要

这篇文章主要介绍Go语言中的反射怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述在程序运行期对程序动态的进行访问和修改reflect godoc: https://golang.org/pkg/reflect

这篇文章主要介绍Go语言中的反射怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

    Go语言中的反射怎么用

    概述

    在程序运行期对程序动态的进行访问和修改

    reflect godoc: https://golang.org/pkg/reflect/

    reflect包有两个数据类型:

    Type:数据类型 【reflect.TypeOf():是获取Type的方法】

    Value:值的类型【reflect.ValueOf():是获取Value的方法】

    语法

    一、基本操作

    获取变量类型

    func TypeOf(i interface{}) Type   //Type是interface{}的别名

    例子

    reflect.TypeOf(10)  //intreflect.TypeOf(struct{ age int }{10})  //struct { age int }

    获取变量的种类

    reflect.TypeOf(struct{ age int }{10}).Kind()  //reflect.Structreflect.ValueOf("hello Word").Kind()  //reflect.String

    获取变量值

    func ValueOf(i interface{}) Value   //value是struct {}别名

    例子

    reflect.ValueOf("hello word")  //hello wordreflect.ValueOf(struct{ age int }{10})   //{10}

    二、修改目标对象

    修改普通类型

    str := "hello word"reflect.ValueOf(&str).Elem().SetString("张三")

    修改结构体

    //第一步:ValueOf():传入一个变量的地址,返回是变量的地址     Elem():返回的是变量的原始值elem:=reflect.ValueOf(&变量名).Elem()//第二步 FieldByName():传入结构体字段名称   SetString():传入你要修改的变量值elem.FieldByName("Name").SetString("李四")
    //定义一个User结构体type User struct {Name stringAge  int}user := User{Name: "张三", Age: 10}//Elem() 获取user原始的值elem := reflect.ValueOf(&user).Elem()//FieldByName() 通过Name返回具有给定名称的结构字段 通过SetString 修改原始的值elem.FieldByName("Name").SetString("李四")elem.FieldByName("Age").SetInt(18)

    三、动态调用方法

    无参方法

    //MethodByName():传方法名,方法名必须大小  Call():方法的形参reflect.ValueOf(变量名).MethodByName(方法名).Call([]reflect.Value{})reflect.ValueOf(变量名).MethodByName(方法名).Call(make([]reflect.Value, 0))
    type User struct {Name string `JSON:"name" name:"张三"`Age  int}func (_ User) Say() {fmt.Println("user 说话")}user := User{Name: "张三", Age: 10}reflect.ValueOf(&user).MethodByName("Say").Call([]reflect.Value{})  reflect.ValueOf(user).MethodByName("Say").Call(make([]reflect.Value, 0))

    有参方法

    reflect.ValueOf(变量名).MethodByName(方法名).Call([]reflect.Value{reflect.ValueOf("该说话了"), reflect.ValueOf(1)})
    type User struct {  Name string `json:"name" name:"张三"`  Age  int}func (_ User) Say() {  fmt.Println("user 说话")}user := User{Name: "张三", Age: 10}reflect.ValueOf(user).MethodByName("SayContent").Call([]reflect.Value{reflect.ValueOf("该说话了"), reflect.ValueOf(1)})

    总结

    反射调用struct的方法必须是公有的

    反射调用无参方法时必修传 nil 或者 []reflect.Value{}

    示例

    package mainimport ("fmt""reflect")func main() {//1. 获取变量类型fmt.Println("获取变量类型")fmt.Println(reflect.TypeOf(10))                          //intfmt.Println(reflect.TypeOf(10.0))                        //float64fmt.Println(reflect.TypeOf(struct{ age int }{10}))       //struct { age int }fmt.Println(reflect.TypeOf(map[string]string{"a": "a"})) //map[string]stringfmt.Println("")//2. 获取变量值fmt.Println("获取变量值")fmt.Println(reflect.ValueOf("hello word"))                //hello wordfmt.Println(reflect.ValueOf(struct{ age int }{10}))       //{10}fmt.Println(reflect.TypeOf(struct{ age int }{10}).Kind()) //struct//类型判断if t := reflect.TypeOf(struct{ age int }{10}).Kind(); t == reflect.Struct {fmt.Println("是结构体")} else {fmt.Println("不是结构体")}//修改目标对象str := "hello word"//普通变量修改reflect.ValueOf(&str).Elem().SetString("张三")fmt.Println(str)//结构体变量修改user := User{Name: "张三", Age: 10}//Elem() 获取user原始的值elem := reflect.ValueOf(&user).Elem()//FieldByName() 通过Name返回具有给定名称的结构字段 通过SetString 修改原始的值elem.FieldByName("Name").SetString("李四")elem.FieldByName("Age").SetInt(18)fmt.Println(user)//获取结构体的标签的值fmt.Println(reflect.TypeOf(&user).Elem().Field(0).Tag.Get("name"))//调用无参方法reflect.ValueOf(&user).MethodByName("Say").Call([]reflect.Value{})reflect.ValueOf(user).MethodByName("Say").Call(make([]reflect.Value, 0))//调用有参方法reflect.ValueOf(user).MethodByName("SayContent").Call([]reflect.Value{reflect.ValueOf("该说话了"), reflect.ValueOf(1)})//调用本地的方法reflect.ValueOf(Hello).Call([]reflect.Value{})reflect.ValueOf(Hello).Call(nil)fmt.Printf("%#v\n", reflect.TypeOf(user).Field(0))}func Hello() {fmt.Println("hello")}type Person struct {Name string}type User struct {Person        // //反射会将匿名字段作为一个独立字段来处理Name   string `json:"name" name:"张三"`Age    int}func (_ User) Say() {fmt.Println("user 说话")}func (_ User) SayContent(content string, a int) {fmt.Println("user", content, a)}

    以上是“Go语言中的反射怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

    --结束END--

    本文标题: Go语言中的反射怎么用

    本文链接: https://www.lsjlt.com/news/305699.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Go语言中的反射怎么用
      这篇文章主要介绍Go语言中的反射怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述在程序运行期对程序动态的进行访问和修改reflect godoc: https://golang.org/pkg/reflect...
      99+
      2023-06-25
    • go语言怎么反射
      Go语言反射是通过reflect包来实现的。在反射中的类型有:1、reflect.Type,代表了一个Go语言类型的元数据;2、reflect.Value,代表了一个值的元数据。Go语言是一种静态类型的编程语言,它提供了一种称为反射(ref...
      99+
      2023-07-10
    • Go语言中的反射是什么
      本篇内容介绍了“Go语言中的反射是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是反射反射,嗯...,就是反着的意思呗,就是把东西反...
      99+
      2023-06-15
    • Go语言中怎么实现结构体反射
      本篇文章给大家分享的是有关Go语言中怎么实现结构体反射,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结构体type Student struct ...
      99+
      2023-06-15
    • 什么是Go语言的反射机制
      这篇文章主要介绍“什么是Go语言的反射机制”,在日常操作中,相信很多人在什么是Go语言的反射机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Go语言的反射机制”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-06-15
    • Go语言的反射机制详解
      反射是语言里面是非常重要的一个特性,我们经常会看见这个词,但是对于反射没有一个很好的理解,主要是因为对于反射的使用场景不太熟悉。 一、理解变量的内在机制 1.类型信息,元信息,是预先...
      99+
      2022-11-13
    • go语言中反射三定律指的是什么
      这篇文章主要介绍“go语言中反射三定律指的是什么”,在日常操作中,相信很多人在go语言中反射三定律指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言中反射三定律指的是什么”的疑惑有所帮助!接下来...
      99+
      2023-07-05
    • 怎么使用Go语言反射获取类型属性
      本篇内容主要讲解“怎么使用Go语言反射获取类型属性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Go语言反射获取类型属性”吧!reflect.StructField 和 reflect....
      99+
      2023-07-02
    • 一文初探Go语言中的reflect反射包
      目录reflect 反射包TypeOf(i) 和 ValueOf(i)案例1:获取变量的类别和类型信息案例2:修改基本数据类型变量的值案例3:通过反射获取结构体的字段名、字段类型和字...
      99+
      2022-12-08
      Go语言reflect反射包 Go语言reflect Go语言 反射包
    • Go语言学习之反射的用法详解
      目录1. reflect 包1.1 获取变量类型1.2 断言处理类型转换2. ValueOf2.1 获取变量值2.2 类型转换3. Value.Set3.1 设置变量值3.2 示例4...
      99+
      2022-11-13
    • Go语言反射reflect.Value实现方法的调用
      目录引言func (Value) Call通过反射,调用方法。通过反射,调用函数。引言 这算是一个高级用法了,前面我们只说到对类型、变量的几种反射的用法,包括如何获取其值、...
      99+
      2022-11-13
    • 详解如何让Go语言中的反射加快
      目录切入点案例反射基本版优化一:加入缓存策略优化二:利用字段偏移量优化三:更改缓存 key 类型优化四:引入描述符总结最近读到一篇关于 Go 反射的文章,作者通过反射给结构体填充字段...
      99+
      2022-11-11
    • 如何在go语言中利用反射精简代码
      这篇文章主要为大家分析了如何在go语言中利用反射精简代码的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何在go语言中利用反射精简代码”的知识吧。反射是 G...
      99+
      2023-06-05
    • Go语言中slice的反转方法怎么使用
      这篇文章主要介绍了Go语言中slice的反转方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中slice的反转方法怎么使用文章都会有所收获,下面我们一起来看看吧。使用for循环和切片的索引最基...
      99+
      2023-07-06
    • 学习Go语言文档中的reflect.Value.Interface函数实现值反射
      学习Go语言文档中的reflect.Value.Interface函数实现值反射,需要具体代码示例在Go语言中,reflect包提供了一系列函数来进行类型的反射操作,其中reflect.Value结构体是reflect包中的一个重要组成部分...
      99+
      2023-11-04
      反射 关键词:Go语言 reflectValueInterface函数
    • Go语言学习教程之反射的示例详解
      目录介绍反射的规律1. 从接口值到反射对象的反射2. 从反射对象到接口值的反射3. 要修改反射对象,该值一定是可设置的介绍 reflect包实现运行时反射,允许一个程序操作任何类型...
      99+
      2022-11-11
    • JAVA语言中的反射机制是什么
      这篇文章主要为大家展示了“JAVA语言中的反射机制是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JAVA语言中的反射机制是什么”这篇文章吧。1、什么是反射?在java开发中有一个非常重要的...
      99+
      2023-06-29
    • Go语言中的:=怎么用
      这篇文章主要为大家展示了“Go语言中的:=怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Go语言中的:=怎么用”这篇文章吧。1. 单变量 :=Go 语言中新增了一个特殊的运算符:=,这个运...
      99+
      2023-06-22
    • Go语言中数组,切片和映射怎么使用
      这篇文章主要讲解了“Go语言中数组,切片和映射怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中数组,切片和映射怎么使用”吧!Arrays (数组), Slices (切片) ...
      99+
      2023-07-02
    • 学习Go语言文档中的reflect.TypeOf函数实现类型反射
      学习Go语言文档中的reflect.TypeOf函数实现类型反射在 Go 语言中,我们可以使用反射的方式来获取一个变量的类型,这就是 reflect.TypeOf 函数的作用。使用这个函数可以动态获取变量的类型,同时也可以根据变量的类型进行...
      99+
      2023-11-04
      Go语言 reflectTypeOf 类型反射
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作