go语言day18 reflect反射

Golang-100-Days/Day16-20(Go语言基础进阶)/day19_Go语言反射.md at master · rubyhan1314/Golang-100-Days (github.com)

7-19 接口:底层实现_哔哩哔哩_bilibili

 一、interface接口

接口类型内部存储了一对pair(value,Type)

     type interface {

               type *Type // 类型信息

               data unsafe.Pointer // 指向具体数据

         }

       空接口类型

        非空接口类型

        接口类型对象接收实际对象:

        1)创建Reader接口类型对象 r:

              io包下的Reader接口类型

       2) 创建指针File类型对象 file  :

                File指针类型实现了Read()和Write()方法:

        3) 将实现类对象 r  赋值给 接口类型Reader对象 r 

                   这里体现多态。

 

          4)创建Writer接口类型对象  w

                        将Reader接口类型r对象强转为 Writer接口类型对象,

                        这里可以实现强转是因为接口类型强转看的是内部存储的type属性:

                                实质上是因为r对象pair的type为*File,而*File类型又实现了Write()方法,

                                也就是实现了Writer接口。强转的过程可以看作是Writer接口类型对象w接收实现类型为*File对象的过程。

二、 reflect

         1) 通过反射获取接口类型对象的具体数据和类型        

               reflect.TypeOf()获取 pair中的type

               reflect.ValueOf()获取 pair中的data

        reflect.TypeOf()

                返回值类型为Type,表示a对象通过反射获取的typeOf对象存储了int类型的的相关信息。

        reflect.ValueOf()   

                        返回值类型为Value,Value类型中存储了值的相关信息,包括了值的类型,值的具体数据。

        reflect.ValueOf().Kind() 

                返回值类型为Kind

        reflect包下的常量类型Kind

                 也就是uint类型

       2) 通过反射获取设置对象属性及调用对象方法。

        2.1) 创建对象Person,设置属性和方法

    2.2)反射属性和方法

        personObj := Person{Name: "银灰", Age: 18}

                创建对象

        reflect.ValueOf(&personObj)

                获取Value对象时使用指针,让Value中存储的是personObj对象属性的地址,才能修改personObj对象属性;

                否则默认会深拷贝一个对象,修改属性跟原对象不相干。

        valueObj.FieldByName("Name").SetString("银灰前夫哥")

                        设置属性

        typeObj.Field(i)

                        获取属性名
        valueObj.Field(i)

                        获取属性 的对应值
        valueMsg := reflect.ValueOf(personObj)

                        获取Value对象

        valueMsg.MethodByName("GetAll").Call([]reflect.Value{})

                        调用对象方法

        valueMsg.MethodByName("GetAll2").Call([]reflect.Value{reflect.ValueOf("萨卡兹沦陷"), reflect.ValueOf(2)})

                        调用对象方法

 

 

        2.3)Kind()和 TypeOf()

                     同样都是获取类型,Kind()获取go包中已存在的类型,对于自定义的结构体类型只会显示struct.

                      显示具体类型使用reflect.TypeOf()

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

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

相关文章

Linux:传输层(2) -- TCP协议(2)

目录 1. 流量控制 2. 滑动窗口 3. 拥塞控制 4. 延迟应答 5. 捎带应答 6. 面向字节流 7. 粘包问题 8. TCP异常情况 1. 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快 , 导致接收端的缓冲区被打满 , 这个时候如果发送端继续发送 , 就会造成丢包, 继而引…

7月24日JavaSE学习笔记

序列化版本控制 序列化:将内存对象转换成序列(流)的过程 反序列化:将对象序列读入程序,转换成对象的方式;反序列化的对象是一个新的对象。 serialVersionUID 是一个类的序列化版本号 private static fin…

oracle 性能指标查询

查看表空间大小以及数据文件大小 select dt.TABLESPACE_NAME, concat(dt.MAX_SIZE,(MB)) total, concat(ddf.total_space,(MB)) used from dba_tablespaces dt,(SELECT tablespace_name,sum(bytes) / (1024 * 1024) total_spaceFROM dba_data_fileswhere TABLESPACE_NAME like…

dsp c6657 SYS/BIOS学习笔记

1 SYS/BIOS简介 SYS/BIOS是一种用于TI的DSP平台的嵌入式操作系统(RTOS)。 2 任务 2.1 任务调度 SYS/BIOS任务线程有0-31个优先级(默认0-15,优先级0被空闲线程使用,任务最低优先级为1,最高优先级为15&am…

使用 EJS 模板引擎的示例

使用 EJS 模板引擎的示例 EJS(Embedded JavaScript)是一种简单的模板引擎,允许你在 HTML 中嵌入 JavaScript 代码。以下是一个使用 EJS 模板引擎的完整示例,包括设置 Express.js 项目、配置 EJS 视图引擎和创建 EJS 模板文件。 …

Java | Leetcode Java题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; class Solution {public int nthUglyNumber(int n) {int[] dp new int[n 1];dp[1] 1;int p2 1, p3 1, p5 1;for (int i 2; i < n; i) {int num2 dp[p2] * 2, num3 dp[p3] * 3, num5 dp[p5] * 5;dp[i] Math.min(Math.min(num2…

2024年网络安全焦点:新兴威胁与防御技术创新

概述 2024年&#xff0c;随着网络技术的发展&#xff0c;网络安全面临的威胁也在不断演变。本文将深入探讨2024年网络安全领域的最新威胁与防御技术创新&#xff0c;并分析它们对企业及个人安全的影响。 新兴威胁分析 云集中风险 随着越来越多的企业将数据和服务迁移至云端…

鸿蒙笔记--存储

这一节了解一下鸿蒙中常用存储API&#xff0c;主要有LocalStorage &#xff0c;AppStorage&#xff0c;PersistentStorage&#xff0c;LocalStorage 是一种页面级UI状态存储机制&#xff0c;主要用于在UIAbility内和页面间共享状态数据。通过使用特定的装饰器&#xff0c;Local…

昇思25天学习打卡营第20天|CV-ResNet50图像分类

打卡 目录 打卡 图像分类 ResNet网络介绍 数据集准备与加载 可视化部分数据集 残差网络构建 Building Block 结构 代码实现 Bottleneck结构 代码实现 构建ResNet50网络 代码定义 模型训练与评估 可视化模型预测 重点&#xff1a;通过网络层数加深&#xff0c;感知…

数据输入输出的概念

文章目录 数据输入输出的概念及在C语言中的实现简单的格式输入与输出用简单的printf函数输出数据用简单的scanf函数输入数据较复杂的输入输出格式控制输出数据格式控制 数据输入输出的概念及在C语言中的实现 数据的输入与输出是相对于计算机而言的。其中&#xff1a; 从计算机…

Linux的shell的date命令

用于生成备份文件的例子 fp"/etc/samba/smb.conf" ; cp -a ${fp} ${fp}.$(date %0y%0m%0d%0H%0M%0S).bak带纳秒ns fp/etc/samba/smb.conf ; cp -a $fp $fp.$(date %0y%0m%0d%0H%0M%0Sns%0N).bakfp/etc/samba/smb.conf ; cp -a $fp $fp.$(date %0y%0m%0d%0…

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台&#xff0c;就像是AI学习者和开发者的超级基地&#xff0c;这里不仅提供丰富的项目、模型和大模型体验&#xff0c;还有一大堆经典数据集任你挑。…

BM58 字符串的排列

1.题目描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n<10n<10 要求&#…

本地搭建rtmp拉流

本地搭建rtmp拉流 可按照步骤来 关注公众号&#xff1a;城羽海 更多有趣实用教程 下载地址: 从微信公众号发送关键词 rtmp可获取下载地址 文章目录 本地搭建rtmp拉流 可按照步骤来 关注公众号&#xff1a;城羽海 更多有趣实用教程 拿到之后如图所下&#xff1f;二、配置obs文…

Spark_Oracle_I_通过jdbc读取oracle程序报错invalid character

问题背景&#xff1a; 我原先是通过我么api直接读取的oracle,现在由于要并行读取这个oracle数据库表数据&#xff0c;因此采用jdbc的方式&#xff0c;一开始我把sql变成query直接查&#xff0c;所以报上面的问题。部分样例代码如下 val date "2024/07/01" val quer…

华为网络模拟器eNSP安装部署教程

eNSP是图形化网络仿真平台&#xff0c;该平台通过对真实网络设备的仿真模拟&#xff0c;帮助广大ICT从业者和客户快速熟悉华为数通系列产品&#xff0c;了解并掌握相关产品的操作和配置、提升对企业ICT网络的规划、建设、运维能力&#xff0c;从而帮助企业构建更高效&#xff0…

一个函数统一238个机器学习R包,这也太赞了吧

Caret 是一个试图标准化机器学习过程的一个包。Caret 对 R 中最常用的机器学习方法 (目前支持238个R包)提供了统一的接口。 进行数据预处理 实现机器学习方法流程化模型构建 通过参数组合和交叉验证评估模型的参数 选择最优模型 评估模型性能 一键满足各种掉包&#xff0c…

Linux开启coredump

在Linux系统中&#xff0c;C/C程序崩溃是常见的问题之一。Coredump是指当一个程序崩溃时&#xff0c;系统把程序运行时的内存数据以二进制文件的形式保存下来&#xff0c;以便程序开发者进行崩溃分析。本文将介绍如何开启并配置Coredump 1、查看并配置coredump 在Linux系统中…

JavaScript实战 - 一个能够做圆周运动的模型

一个能够做圆周运动的模型 HTML 文件JavaScript 文件总结 作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&…

分组背包--完全背包

分组背包:多个物品分组&#xff0c;每组只能取1件 每一组的物品都可能性展开就可以&#xff0c;时间复杂度为O(物品的数量*背包的容量) 分组背包 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStre…