当前位置: 首页 > news >正文

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()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数仓建模:DWS层该如何建设?如何设计通用数据模型?
  • 分布式相关理论详解
  • 什么是贝叶斯优化(Bayesian Optimization)?
  • 昇思 25 天学习打卡营第 24 天 | MindSpore Pix2Pix 实现图像转换
  • 50、PHP 实现选择排序
  • 分布式锁的三种实现方式:Redis、基于数据库和Zookeeper
  • C#:枚举及位标志周边知识详解(小白入门)
  • Kafka知识总结(选举机制+控制器+幂等性)
  • 在 Elasticsearch 中实现采集自动扩展
  • Python urllib请求https接口报错
  • python异步编程,协程
  • java中的函数式接口介绍
  • python inf是什么意思
  • Centos安装、迁移gitlab
  • 数据透视——判别分析
  • eclipse的离线汉化
  • Java应用性能调优
  • Mybatis初体验
  • Redis字符串类型内部编码剖析
  • scrapy学习之路4(itemloder的使用)
  • webgl (原生)基础入门指南【一】
  • 大数据与云计算学习:数据分析(二)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 如何使用 JavaScript 解析 URL
  • 使用Swoole加速Laravel(正式环境中)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个JAVA程序员成长之路分享
  • Semaphore
  • 国内开源镜像站点
  • 湖北分布式智能数据采集方法有哪些?
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​【已解决】npm install​卡主不动的情况
  • ​520就是要宠粉,你的心头书我买单
  • #前后端分离# 头条发布系统
  • (1) caustics\
  • (2)Java 简介
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二十三)Flask之高频面试点
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (实战篇)如何缓存数据
  • (算法)N皇后问题
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 生成二级域名
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .Net中的设计模式——Factory Method模式
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @TableLogic注解说明,以及对增删改查的影响
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [C++]STL之map