我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang反射机制怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Golang反射机制怎么使用

本文小编为大家详细介绍“Golang反射机制怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang反射机制怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

介绍

反射的本质就是在程序运行的时候,获取对象的类型信息和内存结构,反射是把双刃剑,功能强大但可读性差,反射代码无法在编译阶段静态发现错误,反射的代码常常比正常代码效率低1~2个数量级,如果在关键位置使用反射会直接导致代码效率问题,所以,如非必要,不建议使用。

静态类型是指在编译的时候就能确定的类型(常见的变量声明类型都是静态类型);动态类型是指在运行的时候才能确定的类型(比如接口,也只有接口才有反射)。

使用反射的三个步骤:

  • 先有一个接口类型的变量

  • 把它转成reflect对象 一般就是type 或者 value类型

  • 然后根据不同的情况调用相应的函数

TypeOf() ValueOf()

为了说明其用法,先举个最简单的例子:

package mainimport (    "fmt"    "reflect")func main() {    var x float64 = 3.4    fmt.Println("type : ", reflect.TypeOf(x))    fmt.Println("value : ", reflect.ValueOf(x))}

运行结果是:

type :  float64
value :  3.4

获取接口变量信息

事先知道原有类型的时候

举个例子:

package mainimport (    "fmt"    "reflect")func main() {    var num float64 = 3.14    //接口类型变量得到一个反射类型的变量    value := reflect.ValueOf(num)    //从一个反射类型对象得到接口类型变量    conervtValue := value.Interface().(float64)    fmt.Println(conervtValue)    //pointer 包含了一个float64的指针类型    pointer := reflect.ValueOf(&num)    convertPointer := pointer.Interface().(*float64)    fmt.Println(convertPointer)}

运行结果是:

14
0x1400012a008

事先不知道原有类型的时候

这时候我们一般需要遍历探测一下Field

举个例子:

package mainimport (    "fmt"    "reflect")type Person struct {    Name   string    Age    int    Gender string}func (p Person) Say(msg string) {    fmt.Println("hello, ", msg)}func (p Person) PrintInfo() {    fmt.Printf("Name: %s, Age: %d, Gender: %s", p.Name, p.Age, p.Gender)}func main() {    p1 := Person{"bill", 16, "Male"}    GetMessage(p1)}//获取input的信息  在这个函数中 输入是空接口//代表我们并不知道input的原始类型是什么 取决于函数调用的时候掺进来什么参数func GetMessage(input interface{}) {    getType := reflect.TypeOf(input)    fmt.Println("输入数据的类型是: ", getType.Name())    fmt.Println("输入数据的种类是: ", getType.Kind())    getValue := reflect.ValueOf(input)    fmt.Println("all fields are: ", getValue)}

运行结果如下:

输入数据的类型是:  Person
输入数据的种类是:  struct
all fields are:  {bill 16 Male}

上面的例子,我们一口气把所有的字段值全部打印出来了,但如果我们想挨个打印每个字段的名字,类型,数值我们应该这样做:

package mainimport (    "fmt"    "reflect")type Person struct {    Name   string    Age    int    Gender string}func (p Person) Say(msg string) {    fmt.Println("hello, ", msg)}func (p Person) PrintInfo() {    fmt.Printf("Name: %s, Age: %d, Gender: %s", p.Name, p.Age, p.Gender)}func main() {    p1 := Person{"bill", 16, "Male"}    GetMessage(p1)}//获取input的信息  在这个函数中 输入是空接口//代表我们并不知道input的原始类型是什么 取决于函数调用的时候掺进来什么参数func GetMessage(input interface{}) {    getType := reflect.TypeOf(input)    fmt.Println("输入数据的类型是: ", getType.Name())    fmt.Println("输入数据的种类是: ", getType.Kind())    getValue := reflect.ValueOf(input)    fmt.Println("all fields are: ", getValue)    //获取字段    for i := 0; i < getType.NumField(); i++ {        field := getType.Field(i)        value := getValue.Field(i).Interface()        fmt.Printf("字段名称: %s, 字段类型: %s, 字段值: %v\n ", field.Name, field.Type, value)    }}

运行结果是:

输入数据的类型是:  Person
输入数据的种类是:  struct
all fields are:  {bill 16 Male}
字段名称: Name, 字段类型: string, 字段值: bill
字段名称: Age, 字段类型: int, 字段值: 16
字段名称: Gender, 字段类型: string, 字段值: Male

如果我们还想获取方法怎么办呢?原理和上面差不多,不过我们需要把field改成method,举个例子:

package mainimport (    "fmt"    "reflect")type Person struct {    Name   string    Age    int    Gender string}func (p Person) Say(msg string) {    fmt.Println("hello, ", msg)}func (p Person) PrintInfo() {    fmt.Printf("Name: %s, Age: %d, Gender: %s", p.Name, p.Age, p.Gender)}func main() {    p1 := Person{"bill", 16, "Male"}    GetMessage(p1)}//获取input的信息  在这个函数中 输入是空接口//代表我们并不知道input的原始类型是什么 取决于函数调用的时候掺进来什么参数func GetMessage(input interface{}) {    getType := reflect.TypeOf(input)    fmt.Println("输入数据的类型是: ", getType.Name())    fmt.Println("输入数据的种类是: ", getType.Kind())    getValue := reflect.ValueOf(input)    fmt.Println("all fields are: ", getValue)    //获取字段    for i := 0; i < getType.NumField(); i++ {        field := getType.Field(i)        value := getValue.Field(i).Interface()        fmt.Printf("字段名称: %s, 字段类型: %s, 字段值: %v\n ", field.Name, field.Type, value)    }    //获取方法    for i := 0; i < getType.NumMethod(); i++ {        method := getType.Method(i)        fmt.Printf("方法名称: %s, 方法类型: %v\n", method.Name, method.Type)    }}

运行结果是:

输入数据的类型是:  Person
输入数据的种类是:  struct
all fields are:  {bill 16 Male}
字段名称: Name, 字段类型: string, 字段值: bill
字段名称: Age, 字段类型: int, 字段值: 16
字段名称: Gender, 字段类型: string, 字段值: Male
方法名称: PrintInfo, 方法类型: func(main.Person)
方法名称: Say, 方法类型: func(main.Person, string)

读到这里,这篇“Golang反射机制怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Golang反射机制怎么使用

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

下载Word文档

猜你喜欢

Golang反射机制怎么使用

本文小编为大家详细介绍“Golang反射机制怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang反射机制怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍反射的本质就是在程序运行的时候,获
2023-06-30

Java反射机制怎么使用

今天小编给大家分享一下Java反射机制怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。反射的概述JAVA反射机制是在运
2023-06-30

C++中怎么使用反射机制

今天就跟大家聊聊有关C++中怎么使用反射机制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Java编程中,我们经常要用到反射,通过反射机制实现在配置文件中的灵活配置, 但在C++编
2023-06-17

golang函数的反射机制

go语言提供了反射机制,用于在运行时检查和操作程序元素。通过 reflect 包,我们可以获取函数类型(reflect.typeof)和值(reflect.valueof),并通过 value.call 方法调用函数。实际应用包括解析和调用
golang函数的反射机制
2024-04-29

golang 反射的机制和使用注意事项

go 语言的反射通过内置的 reflect 包实现,使用 type 和 value 类型分别表示类型和值。反射常见用途包括动态类型检查、代码生成、元编程和序列化/反序列化。使用注意事项包括性能开销、安全性问题和易用性挑战。Go 语言反射:深
golang 反射的机制和使用注意事项
2024-05-05

GoLang反射机制深入讲解

这篇文章主要介绍了GoLang反射机制,反射是一种让程序可以在运行时(runtime)检查其数据结构的能力,通过反射可以获取丰富的类型信息
2022-12-23

Java反射机制怎么应用

本篇内容主要讲解“Java反射机制怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反射机制怎么应用”吧!反射基础p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没
2023-06-17

Python反射机制怎么应用

本文小编为大家详细介绍“Python反射机制怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python反射机制怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是反射在Python中,反射是指通
2023-07-05

如何使用Java反射机制

这篇文章主要介绍“如何使用Java反射机制”,在日常操作中,相信很多人在如何使用Java反射机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Java反射机制”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-15

PHP中如何使用反射机制?

反射机制允许php程序在运行时检查和修改自身结构,包括获取类型信息、调用方法、设置属性等。通过使用reflection类,开发者可以创建反射对象,并使用is()、get()、invoke()和setvalue()方法来获取信息、调用方法和设
PHP中如何使用反射机制?
2024-05-21

java中的反射机制怎么应用

Java中的反射机制可以应用于以下场景:动态加载类:可以在运行时加载指定的类,而不是在编译时就确定类的类型。创建对象:可以通过反射机制动态创建对象,而不是使用new关键字。调用方法:可以通过反射机制动态调用对象的方法,包括私有方法。访问属性
2023-10-23

Java反射机制怎么理解

本篇内容主要讲解“Java反射机制怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反射机制怎么理解”吧!1. 简介定义:Java语言中 一种动态(运行时)访问、检测 & 修改它本身
2023-06-03

JAVA中怎么实现反射机制

这期内容当中小编将会给大家带来有关JAVA中怎么实现反射机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JAVA反射机制定义:  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属
2023-06-17

Golang reflect反射如何使用

这篇文章主要介绍“Golang reflect反射如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang reflect反射如何使用”文章能帮助大家解决问题。首先有一段以下结构体的定义t
2023-07-06

java反射机制有什么作用

本篇内容介绍了“java反射机制有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本教程操作环境:windows7系统、java10版
2023-06-30

Java中反射机制有什么用

这篇文章主要为大家展示了“Java中反射机制有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中反射机制有什么用”这篇文章吧。反射:可以动态的获取指定类中的成员,以及建立类对象。好处
2023-06-17

什么是java反射机制

java:“一切即对象”,感觉java语言本身在不断践行着这句话。java反射机制的基础来源于一个Class类,我们可以通过这个类里面的方法来对每一个类进行读取、实例化等。对象表示或封装一些数据。一个类被加载后,jvm会创建一个对应该类的Class对象(一个类
什么是java反射机制
2019-08-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录