非零基础自学Golang 第14章 反射 14.1 反射定义

news2025/1/24 8:36:28

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第14章 反射
        • 14.1 反射定义
          • 14.1.1 反射的定义
          • 14.1.2 与其他语言的区别

第14章 反射

我们常用的一个打印函数fmt.Println()可以打印任何类型的数据,但是它本身是怎么实现的呢?

解读源码可以看到,fmt包使用了一个叫reflect的反射标准库,也就是基于Go语言反射的特性写出来的

反射的强大之处就在于它非常灵活,通常用于做一些通用框架代码,而不需要理解业务,因此具有快速处理不同业务的功能。但它强大的同时也带来了很多弊端,比如代码可读性和可维护性变差,性能也大打折扣。

因此,是否使用反射需要进行利弊权衡后决定,并不是所有的程序都适合使用反射。

14.1 反射定义

14.1.1 反射的定义

Go语言提供了一种机制:在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,但是在编译时并不知道这些变量的具体类型。

这种机制被称为反射。Go语言在reflect包中实现了反射,通过reflect.TypeOf(),reflect.ValueOf()分别从类型、值的角度来描述一个Go对象。

反射并不是一个新概念,Go语言反射与其他语言有一定的差异,我们先来了解一下其他语言中的反射。

14.1.2 与其他语言的区别

Java的反射机制是其标志性的特征之一,正是这种语言本身支持的强大的机制,使很多流行的框架有了用武之地。

在运行状态中,Java对于任何的类,都能够确认这个类的所有方法和属性;对于任何一个对象,都能调用它的任意方法和属性。

这种动态获取或者调用的方式就是Java的反射机制。

在Java中,通过反射机制在运行时能够做到:

  • 确认对象的类。
  • 确认类的所有成员变量和方法。
  • 动态调用任意一个对象的方法。

下面举一个例子,看在Java中如何通过反射获取一个Class对象。

[ 动手写 14.1.1]

package Java20221205.test;

/**
 * ClassName: Ref
 * date: 2022/12/5 19:54
 *
 * @author DingJiaxiong
 */
public class Ref {

    public static void main(String[] args) {

        // 1. 通过对象调用getClass() 方法来获取, 通常应用在比如你传过来一个Object 类型的对象,而我不知道你具体是什么类 的情况
        Student stu1 = new Student();
        Class stuClass = stu1.getClass();

        // 2. 直接通过“ 类名.class” 的方式得到, 该方法最为安全可靠, 程序性能更高
        // 这也说明Java 中任何一个类都有一个 隐含的静态成员变量 class
        Class stuClass2 = Student.class;

        // 3. 通过Class 对象的forName() 静态方法来获取, 用得最多, 但可能抛出ClassNotFound Exception 异常
        try {
            Class stuClass3 = Class.forName("com.test.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

}

Java可以通过三种方式反射获得一个Class对象,分别是

  • 通过对象调用getClass()方法
  • 通过类名.class
  • 通过Class对象的forName()静态方法来获取。

在Go语言中,只能使用如上所示的第一种方法来反射获取运行状态的对象的值或方法,最重要的是,Go语言不支持通过对字符串解析,从而反射出对应的类型结构,这点与Java反射有着很大的区别。

我们再来看一个Go反射的例子:

[ 动手写 14.1.2 ]

package main

import (
   "fmt"
   "reflect"
)

func main() {

   var a interface{} = "我是字符串"
   typeOfa := reflect.TypeOf(a)

   fmt.Println("变量a 的类型为: " + typeOfa.Name())
   valueOfa := reflect.ValueOf(a)

   if typeOfa.Kind() == reflect.String {
      fmt.Println("变量a 的值为: " + valueOfa.String())
   }
}

动手写14.1.2中,使用reflect.TypeOf()获取了变量a的值类型,使用reflect.ValueOf()获取了变量a的原始值,这两个函数非常重要,后面会详细介绍它们的使用,运行结果如下:

在这里插入图片描述

【提示】

Go语言不支持解析string然后执行。Go语言的反射机制只能作用于已经存在的对象上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人员定位系统如何实现对人、车、物的安全管控?

人员定位系统是采用物联网设计理念,通过结合定位基站、视频监控、人脸抓拍、巡更、门禁、道闸、梯控等系统,对管控区域工作人员、访客、巡检人员进行精细化、规范化、智能化理。 智慧安全的概念随着物联网技术的发展逐渐成为发展趋势,人员定位…

【Python机器学习】卷积神经网络Vgg19模型预测动物类别实战(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 典型神经网络 在深度学习的发展过程中,出现了很多经典的卷积神经网络,它们对深度学习的学术研究和工业生产斗起到了促进的作用,如VGG ResNet Inception DenseNet等等,很多实际…

偷偷告诉你!与其辞职,不如用Python做月入过万的副业兼职

我想辞职! 这是不是当下的你?在这个疫情当下的时代,许多打工人都有过这么一个想法,或许是因为工作待遇、亦或许是其他原因,但是却仍然屹立在工位上,有的甚至天天喊辞职,月月拿满勤。这是为什么…

阿里大牛解析微服务架构:Docker,Spring全家桶,分布式,数据库

前言 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则。微服务架构是个很有趣的概念,它的…

【愚公系列】2022年12月 使用Jenkins实现程序的自动化发布

文章目录前言一、使用Jenkins实现程序的自动化发布1.安装Jenkins二、安装Gitee插件前言 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进…

如何用 Prometheus 和 Grafana 实现集群的监控预警

在读写、查询等高并发场景中,了解资源的使用情况能快速定位性能的瓶颈所在。本教程提供对多(或单)服务器及 DolphinDB 高可用集群(或单节点)资源的监控、告警、预警方案。本教程使用开源软件 Prometheus, Grafana 及对…

Git实战(四)| Git分支管理实操,搞定在线合并和本地合并

类似于SVN这种集中式版本管理,三年前刚来上海工作时候,在华为驻场上班,华为用的就是SVN,印象最深的就是那个小乌龟的图标;后来到外面工作,渐渐发现用Git的非常多,慢慢学习了解发现Git这种分布式…

5年Crud的我,啃完这份Java王者级核心宝典,成功入职阿里(P7)

我有话要说,请仔细看完 我发现一个现象,很多开发5年的程序员仍然停留在crud的阶段,这是什么原因?最主要的原因就是基础很差,尤其对于JVM和并发编程这方面掌握的比较差,而JVM和并发编程就是非常非常重要的基…

40问 深度挖掘Kafka,你能答上几个?

Kafka最初是由Linkedin公司开发的,是一个分布式的、可扩展的、容错的、支持分区的(Partition)、多副本的(replica)、基于Zookeeper框架的发布-订阅消息系统,Kafka适合离线和在线消息消费。它是分布式应用系…

SQL基础——集合运算

集合运算前言思维导图表的加减法表的加法——UNION(并集)代码示例7.1 创建表Product2代码示例7.2 将数据插入到表Product2中(MYSQL)代码示例7.3 使用UNION对表进行加法运算包含重复行的集合运算——ALL选项代码示例7.5 保留重复行…

自动机器学习-auto-sklearn

1、前言 自动机器学习(AutoML) 旨在通过让一些通用步骤 (如数据预处理、模型选择和调整超参数) 自动化,来简化机器学习中生成模型的过程。AutoML是指尽量不通过人来设定超参数,而是使用某种学习机制,来调节这些超参数…

阿里微服务架构到底多牛逼:深入解析Apache Dubbo与实战

本书的由来 在Apache Dubbo (以下简称Dubbo)重新开源之前,Dubbo已经被很多公司广泛用于生产环境并获得了良好的反馈,很多公司内部也会建立私有分支自己维护,其中Dubbox 就是基于Dubbo分支进行扩展并二次维护的。重新开源后,社区维…

【ESXi 7.x内部升级】ESXi 升级 —— 小版本升级(7.X或8.X版本内升级)

目录4. 小版本升级(7.X或8.X版本内升级)4.1 示例 — 使用 vSphere Lifecycle Manager升级 ESXi目标:将 VMware ESXi 7.0 U2e 升级为 7.0 U3f(1)在vSphere Client 中查看需要升级的 ESXi 版本(2)…

【微信篇】PC端微信文件夹里的“微信号“

【微信篇】PC端微信文件夹里的"微信号" 更新记录最敷衍的软件一微信!!!—【蘇小沐】 文章目录【微信篇】PC端微信文件夹里的"微信号"1.实验环境PC端微信文件夹里的"微信号"总结1.实验环境 系统版本Windows 1…

深度学习入门(六十四)循环神经网络——编码器-解码器架构

深度学习入门(六十四)循环神经网络——编码器-解码器架构前言循环神经网络——编码器-解码器架构课件重新考察CNN重新考察RNN编码器-解码器架构总结教材1 编码器2 解码器3 合并编码器和解码器4 训练模型5 小结参考文献前言 核心内容来自博客链接1博客连…

分布式任务调度 - PowerJob

一、简介 1、介绍 PowerJob(原OhMyScheduler)是全新一代分布式任务调度与计算框架,其主要功能特性如下: 使用简单:提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查&am…

数据库原理及MySQL应用 | 约束

约束是保证数据完整性的一种数据库对象,按约束作用不同,分为七种。 约束从字面上来看就是受到限制,它是附加在表上,通过限制列中、行中、表之间数据来保证数据完整性的一种数据库对象。 在MySQL中,有多种约束&#xf…

设计模式原则 - 开闭原则(五)

开闭原则一 官方定义基本介绍二 案例演示普通实现方式案例分析开闭原则实现案例分析三 注意事项一 官方定义 开闭原则( Open Close Principle ),又称为OCP原则,他的官方定义如下: Software entities like classes,modu…

基于Java+Swing+Mysql实现停车场管理系统

基于JavaSwingMysql实现停车场管理系统一、系统介绍二、系统展示三、其它1.其他系统实现一、系统介绍 1.系统功能 用户 1.登录系统 2.信息查询 包含计费标准,当前在场信息,用户历史信息,用户个人信息,出入场信息,当前…

Win10提示错误代码0xc0000001的解决办法

​有一些朋友在使用Win10系统的时候会遇到蓝屏故障,提示“无法正常启动你的电脑,在多次尝试后,你的电脑上的操作系统仍无法启动,因此需求对其进行修复。” Win10提示恢复无法正常启动你的电脑0xc0000001 故障原因: 错误…