[go 反射] 入门
[go 反射] 入门
首先认识go 反射的两大概念,反射之路少不了他们
- reflect.Type(接口)获取类型,和列名就找它
- reflect.Value(结构体)获取值,设置值找它
[tips] 通常是用这两者手底下的方法,reflect.Value结构体中有什么自行查看
演示
获取其类型(类型的准确识别定位是反射之路的基本功)
import ("reflect""fmt"
)
type One struct{One string `name:"one"`Two int `age:"age"`
}
func main(){var(one Onetwo string)otp:=reflect.TypeOf(one)ttp:=reflect.TypeOf(two)fmt.Println(otp.Kind(),ttp.Kind())//Kind负责输出基本类型,int,string,map,array,slice,pointer,struct(这里的one就属于struct),func//针对struct类获取其子字段名,特性,标签if otp.Kind()==reflect.Struct{//类型的检验是防止意外panic的必要预防之一,减少代码的不可预测性field_count:=otp.NumField()if field_count>0{var oftp reflect.StructFieldfor i:=0;i<field_count;i++{oftp=otp.Field(i)fmt.Println(oftp.Type.Kind(),oftp.Name,oftp.Tag)//走字段结构体输出才会拿到字段名和标签,reflect.Type拿到的名字是Kind()的go基本类型}}}
}
Elem()是reflect.Type和reflect.Value都存在的方法,它的作用为获取指针指向的本体,如果非指针使用此方法会造成panic
通过反射设置值
import ("fmt""reflect"
)func main(){//演示效果:将two的值设置到one上var(one stringtwo string="im two")otp:=reflect.TypeOf(one)ttp:=reflect.TypeOf(two)//假设我们不知道传入的两个参数的类型if otp==ttp{//适用于一切严格类型对比(非严格就是,你希望两个类型之间出现兼容性,特别是不同结构体之间的兼容,需要手动对比和赋值)ovl:=reflect.ValueOf(&one).Elem()//这里为了能使其修改必须是其指针,elem()导向本体过后便可对其操作tvl:=reflect.ValueOf(two)//单纯获得其值,并且这里不是指向two的指针,所以是不可修改的if ovl.CanSet(){//这个需为true,才能进行后续赋值,不检查这个,如果是你自己结构体字段首字母小写之类的导致不能赋值会造成panicovl.Set(tvl)//赋值fmt.Println(one)} }
}
使用泛型进行限制
虽然两个参数都是类型不作限制,但是dst会被限制为任意类型的指针。这在[go 反射]之旅中能在输入参数上进行很大程度的优化,例如后续的反射拷贝(因为dst必须是指向你拷贝目标的指针才能对目标进行更改,而强制dst为指针也是变相提醒使用此函数的人,此处必须为指针
)
func One[T any](dst *T,src any)error
一些可能会踩进去的小坑
- 反射未初始化的指针(
var one *string
,直接进行反射赋值会导致panic:invaild memory);解决方案:reflect.Value类型有一个方法IsNil,通过它先预判一遍,空的就返回,或者反射创建对象(后续go 反射 进阶会细说) - 结构体字段首字母大小写:如果你结构体中某个字段不能canset,并且你valueof目标结构体的指针再elem进行canset,第一反应应该是检查大小写(大小写也是流畅控制是否暴露内部字段的重要技巧)
现在你就学会了go 反射的基础技能了,能使用反射识别类型,和赋值。如果操练此文时遇见什么问题google也无解的,可私信我,一起学习交流交流
相关文章:
[go 反射] 入门
[go 反射] 入门 首先认识go 反射的两大概念,反射之路少不了他们 reflect.Type(接口)获取类型,和列名就找它reflect.Value(结构体)获取值,设置值找它 [tips] 通常是用这两者手底下的方法,reflect.Value结构体中有什么自行查看 …...

【计算机网络】数据链路层-MAC和ARP协议
文章目录 1. 认识以太网2. MAC协议MAC帧的格式MAC地址和IP地址的区别MTU 3. 局域网通信原理碰撞检测和避免 4. ARP协议ARP数据报的格式ARP缓存 1. 认识以太网 网络层解决的是跨网络点到点传输的问题,数据链路层解决的是同一网络中的通信。 数据链路层负责在同一局域…...

本周三商店更新:多款套装下线,四款升级武器带异色皮肤返厂
本周三将迎来26.2版本更新与11商店大更新,版本更新可点击26.2版本更新公告进行查看,这里不一一赘述了,下面大概罗列一下商店更新,有皮肤下架,大家还能趁最后时间入手,最重要的是四款升级武器返厂咯。 危险玩…...

WindowsServer2019-搭建FTP服务器
这里写自定义目录标题 一、基础配置IP地址安装FTP服务检查连通性Windows10连接FTP服务 二、了解和使用FTP具体模块及其配置1、FTP IP地址和域限制2、FTP SSL设置3、FTP当前会话4、FTP防火墙5、FTP目录浏览6、FTP请求筛选7、FTP日志8、FTP身份验证9、FTP授权规则10、FTP消息11、…...
国际阿里云服务器买哪种好用点?
在当时数字化年代,云核算已经成为了企业进行事务运营和数据存储的重要东西。而阿里云作为我国最大的云核算服务供给商,其服务器产品线也适当丰厚。那么,对于用户来说,阿里云服务器买哪种好用点呢?这需求依据个人和企业…...
2023NOIP A层联测25 总结
T1 让你构造 40 40 40\times40 4040 的只含 r,y,x 的矩阵,含有 r y x ryx ryx 的个数恰好为 n n n, n ≤ 2222 n\le2222 n≤2222。看完题后就开始想构造,一开始想构造 3 ∗ 3 3*3 3∗3, 5 ∗ 5 5*5 5∗5 的单位矩阵的,但是始…...

Thread类的基本操作(JAVA多线程)
线程是操作系统中的概念,操作系统内核实现了线程这样的机制,并提供了一些API供外部使用。 JAVA中 Thread类 将系统提供的API又近一步进行了抽象和封装,所以如果想要使用多线程就离不开 Thread 这个类。 线程的创建(Thread类) 在JAVA中 创建…...
Redis 的三种部署模式
提前叠个 buff:这个文章不涉及图(画起来比较麻烦),只是记录我的胡思乱想。 redis 从单点 -> 集群总共有三个部署模式:单机模式,主从模式,哨兵模式,集群模式 单机模式 新手入门模…...
【ArcGIS Pro二次开发】(73):使用NPOI库操作Excel
NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。 NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 相较于之前使用的Microsoft.Office.Interop.Excel,已经感觉到的优势,一是读写速度较快,虽然小数据量的读…...

python获取电脑所连接的wifi密码
电脑连接wifi后,很难直观地看到当前连接wifi的密码,需要借助命令行公管局才可以查看到相关信息。 CMD命令 查看所有已保存的wifi配置信息 netsh wlan show profiles查看某一个wifi的详细信息,需要输入wifi名称来查询 netsh wlan show pro…...

动态壁纸软件Live Wallpaper HD mac中文版功能特色
Live Wallpaper HD mac提供了一系列美丽的主题场景,将为您的桌面增添活力。从城市景观、日落到遥远的星系,每个屏幕都有特别的触感,可以定制您的天气小部件和时钟样式,并使用您喜爱的图片创建您自己的个性化壁纸。 Living Wallpap…...
Spring Boot 配置主从数据库实现读写分离
一、前言 现在的 Web 应用大都是读多写少。除了缓存以外还可以通过数据库 “主从复制” 架构,把读请求路由到从数据库节点上,实现读写分离,从而大大提高应用的吞吐量。 通常,我们在 Spring Boot 中只会用到一个数据源࿰…...

【MongoDB】索引 - 单字段索引
MongoDB支持在集合文档中的任意字段上创建索引,默认情况下所有的集合都有一个_id字段的索引,用户和应用可以新增索引用于查询和操作。 一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, clas…...
评估大型语言模型:综述
论文地址:https://arxiv.org/pdf/2310.19736v2.pdf github: tjunlp-lab/awesome-llms-evaluation-… 发表团队:Tianjin University 摘要 将LLM评估划分三点:知识和能力评估、一致性评估和安全性评估。特定领域化评估benchmark评…...

设计模式之工厂模式(Factory)
任何可以产生对象的方法或类,都可以称为工厂。 下面的代码定义了Car这种交通工具: public class Car {public void go() {System.out.println("Car go wuwuwuwuw....");} }然后在main函数里面想要调用调用Car的go方法,就需要new一个car对象&…...

2023/11/6 JAVA学习
处理编译异常的两种方法 第一种 第二种 问题比较容易犯,编译时异常...

Android-JobService
JobService 这里写目录标题 JobService一、API详解1 onStartJob2 onStopJob 二、onStartJob | onStopJob 返回值case 1case 2case 3 ref: 深入理解JobScheduler与JobService的使用 - 掘金 (juejin.cn) (28条消息) JobService的使用介绍_TechMerger的博客-CSDN博客 (28条消息) J…...

GraphQL入门与开源的GraphQL引擎Hasura体验
背景 Hasura 是一个开源的 GraphQL 引擎,它可以帮助开发人员快速构建和部署现代应用程序的后端。它提供了一个自动化的 GraphQL API ,可以直接连接到现有的数据库,并提供实时数据推送和订阅功能。 Hasura 团队总部位于印度。 下载安装 脚本…...

Javascript知识点详解:this关键字的指向问题
目录 this 关键字 涵义 实质 使用场合 使用注意点 避免多层 this 避免数组处理方法中的 this 避免回调函数中的 this 绑定 this 的方法 Function.prototype.call() Function.prototype.apply() Function.prototype.bind() 箭头函数中的 this this 关键字 涵义 t…...

数据库的备份和恢复
备份:完全备份,增量备份 完全备份:将整个数据库完整的进行备份 增量备份:在完全备份基础的之上,对后续新增的内容进行备份 备份的需求 1生产环境中,数据的安全性至关重要,任何数据都可能产生非…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...