go学习part20(1)反射

news2024/11/17 11:49:37

283_尚硅谷_反射基本介绍和示意图_哔哩哔哩_bilibili

1.介绍

1)基本数据类型的类型和类别一致,但是结构体等不一样。

 

 

2)反射的例子(桥连接,序列化)

 序列化指定tag,会反射生成tag字符串

 

3)reflect可以获取对象value和type值,value是一个结构体,type是一个接口。一个变量的type和value可以相互获取且都可以反过来操纵变量。

 

三者关系

 

4)一些概念

转换关系图:

变量传给空接口形参,

 

 

2.基本使用

1)

对reflect.Type输出是它内部封装的类型,对reflect.Value输出是它内部封装的值,但要注意它们虽然输出和int一样但是实际一个是Type接口一个是Value结构体。感觉有点像包装一个类型结构体然后绑定String()方法输出内部数值。实际类型是一个包装类型,但是输出内容的都是内部存储类型。

验证:对reflect.Value执行加int操作,系统报错,提示类型错误,表明reflect.ValueOf(b)的结果并不是int

2)想要取用reflect.Value内部的值,有两种方法

法一:Value结构体提供了许多方法可以直接修改或者读取内部的值,可以直接调用。

        修改:Value.Set类型(传参)

        读取:Value.类型()

法二:把Value转成interface{},然后再用断言转成其他类型。

        转interface{}:Value.Interface()

3)基本类型的反射

package main

import (
	"fmt"
	"reflect"
)

func reflectTest01(b interface{}) {
	//通过反射获取的传入的变量的 type , kind,值
	//感觉有点像包装一个类型结构体然后绑定String()方法输出内部数值。
	//实际类型是一个包装类型,但是输出内容的都是内部存储类型。
	//1。先获取到 reflect.Type
	rType := reflect.TypeOf(b)
	fmt.Println(rType) //真正类型是reflect.Type,但是输出会自动变成内部存储类型的实际类型int

	//2。先获取到 reflect.Value
	rVal := reflect.ValueOf(b)
	//报错cannot convert 2 (untyped int constant) to type struct{typ *reflect.rtype,
	//说明实际不是int类型而是reflect.Value
	//所以Value提供了很多方法去修改或者读取内部的值
	//n2 := 2 + rVal
	n2 := 2 + rVal.Int() //读取内部Int值
	fmt.Println(n2)
	fmt.Println(rVal) //真正类型是reflect.Value,但是输出会自动变成内部存储类型的实际值
	fmt.Printf("rVal内部数值:%v,rVal真正类型:%T\n", rVal, rVal)

	//3.将rVal转成interface{}
	iV := rVal.Interface() //把内部值按空接口类型输出
	//通过断言把interface{}转成需要的类型
	n3 := iV.(int)
	fmt.Println("n3=", n3)

}

func main() {
	演示对(基本数据类型、interface{(}、reflect.value)进行反射的基本操作
	var num int = 100
	reflectTest01(num)

}

 

 

4)结构体类型的反射

package main

import (
	"fmt"
	"reflect"
)


type Student struct {
	Name string
	Age  int
}

// 对结构体反射
func reflectTest02(b interface{}) {
	//1。先获取到 reflect.Type
	rType := reflect.TypeOf(b)
	fmt.Println(rType) //真正类型是reflect.Type,但是输出会自动变成内部存储类型的实际类型int

	//2。先获取到 reflect.Value
	rVal := reflect.ValueOf(b)

	//3.将rVal转成interface{}
	iV := rVal.Interface()                        //把内部值按空接口类型输出
	fmt.Printf("iV 内部数值:%v,iV 真正类型:%T\n", iV, iV) //运行看实际类型,所以输出的是Student类型
	//虽然运行输出可以,但是想调用Student内容是不行的,编译不知道底层实际类型,所以需要通过断言把interface{}转成需要的类型
	stu, ok := iV.(Student) //也可以switch
	if ok {
		fmt.Println("stu.Name=", stu.Name)
	}

}

func main() {
	演示对(基本数据类型、interface{(}、reflect.value)进行反射的基本操作)

	//2.定义结构体
	stu := Student{
		Name: "tom",
		Age:  20,
	}

	reflectTest02(stu)
}

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

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

相关文章

【Alibaba中间件技术系列】「RocketMQ技术专题」RocketMQ消息发送的全部流程和落盘原理分析

RocketMQ目前在国内应该是比较流行的MQ 了,目前本人也在公司的项目中进行使用和研究,借着这个机会,分析一下RocketMQ 发送一条消息到存储一条消息的过程,这样会对以后大家分析和研究RocketMQ相关的问题有一定的帮助。 分析的总体…

如何增长LLM推理token,从直觉到数学

背景: 最近大模型输入上文长度增长技术点的研究很火。为何要增长token长度,为何大家如此热衷于增长输入token的长度呢?其实你如果是大模型比价频繁的使用者,这个问题应该不难回答。增长了输入token的长度,那需要多次出入才能得到…

【LeetCode】383. 赎金信 - hashmap/数组

这里写自定义目录标题 2023-8-28 22:54:39 383. 赎金信 2023-8-28 22:54:39 次数 ----> hashmap 和 数组来进行实现。 public class Solution {public boolean canConstruct(String ransomNote, String magazine) {// num 用于存储小写字母出现的次数int[] num new in…

vue报错RangeError: Maximum call stack size exceeded

这种情况,一般是跳转路由时发生此类错误,像我的就是如此。比如路由指向的vue文件里代码有错误,或者设置路由时重定向了路由自己,造成死循环。 1、首先检查自己跳转的路由地址的代码本身是否有语法错误之类的,造成错误…

如何实现的手机实景自动直播,都有哪些功能呢?

手机实景自动直播最近真的太火了,全程只需要一部手机,就能完成24小时直播带货,不需要真人出镜,不需要场地,不需要搭建直播间,只需要一部手机就可以了。真人语音讲解,真人智能回复,实…

「操作系统」1. 基础

前言:操作系统基础八股文 文章目录 一 、操作系统基础1.1 什么是操作系统?1.2 什么是系统调用1.3 什么是中断 🚀 作者简介:作为某云服务提供商的后端开发人员,我将在这里与大家简要分享一些实用的开发小技巧。在我的职…

腾讯云-对象存储服务(COS)的使用总结-JavaScript篇

简介 对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式,用户可简单、快速地接入 COS&#xff0…

ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习

一、学习层面:ChatGPT帮助高职院校学生实现个性化自适应学习与对话式学习 1.帮助高职院校学生实现个性化自适应学习 数字技术的飞速发展引起了教育界和学术界对高职院校学生个性化自适应学习的更多关注和支持,其运作机制依赖于人工智能等技术&#xff0…

面经:微服务

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册:Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式?2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …

微信小程序校园生活小助手+后台管理系统|前后分离VUE

《微信小程序校园生活小助手后台管理系统|前后分离VUE》该项目含有源码、文档等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&#…

【RISC-V】RISC-V寄存器

一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…

金融风控数据分析-信用评分卡建模(附数据集下载地址)

本文引用自: 金融风控:信用评分卡建模流程 - 知乎 (zhihu.com) 在原文的基础上加上了一部分自己的理解,转载在CSDN上作为保留记录。 本文涉及到的数据集可直接从天池上面下载: Give Me Some Credit给我一些荣誉_数据集-阿里云…

数字化新零售平台系统提供商,门店商品信息智慧管理-亿发进销存

传统的批发零售业务模式正面临着市场需求变化的冲击。用户日益注重个性化、便捷性和体验感,新兴的新零售模式迅速崛起,改变了传统的零售格局。如何在保持传统业务的基础上,变革发展,成为了业界亟需解决的问题。 在这一背景下&…

Abaqus三维随机多面体插件—AbyssFish – Random Polyhedron Aggregate

插件介绍 AbyssFish – Random Polyhedron Aggregate 插件可在Abaqus软件内批量生成随机分布的三维多面体骨料模型。插件可指定骨料分布的区域、三种尺寸的粒径分布范围、多面体面数、各尺寸骨料的数量等信息,同时可控制骨料间的最小间距及插件的运行时间控制。 使…

Linux常用工具(pidstat stress cgroup)

目录 1.pidstat 2.stress 3.cgroup 4.使用cgroup进行内存限制 5.使用cgroup进行cpu使用率控制 1.pidstat 安装和使用(centos): yum install sysstats yum remove sysstats pidstat -u(默认),查看进程cpu使用情况: pidstat …

Spring MVC: 请求参数的获取

Spring MVC 前言通过 RequestParam 注解获取请求参数RequestParam用法 通过 ServletAPI 获取请求参数通过实体类对象获取请求参数附 前言 在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调…

解决 beego上传文件时 报http: no such file 错误

上传时文件上传失败: 关键报错的代码: //获得文件名filename := header.Filename//上传文件//注意,这里SaveToFile参数要跟传入的文件名的key一致,否则就会报http: no such fileerr = f.SaveToFile(filename, "./static/file/"+filename)if err != nil {logs.Error(e…

大数据课程K13——Spark的距离度量相似度度量

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的距离度量和相似度度量; ⚪ 掌握Spark的欧氏距离; ⚪ 掌握Spark的曼哈顿距离; ⚪ 掌握Spark的切比雪夫距离; ⚪ 掌握Spark的最小二乘法; 一、距离度量和相似度度量 1. …

linux系统(centos、Ubuntu、银河服务器)备份

制作u盘启动盘 下载usblive系统镜像 Get Kali | Kali Linux 下载u盘启动工具 balenaEtcher - Flash OS images to SD cards & USB drives 点击下载,等待下载完成 双击安装,等待安装完成 双击 启动 选择镜像 选择U盘 开始烧录 等地制作完成 进入…

PowerBuilder连接SQLITE3

PowerBuilder,一个古老的IDE,打算陆续发些相关的,也许还有人需要,内容可能涉及其他作者,但基本都是基于本人实践整理,如涉及归属,请联系. SQLite,轻型数据库,相对与PowerBuilder来说是个新事务,故发数来,以供参考. PB中使用OLE Microsoft OLE DB方式进行连接,如下 // Profile…