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

[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

一些可能会踩进去的小坑

  1. 反射未初始化的指针(var one *string,直接进行反射赋值会导致panic:invaild memory);解决方案:reflect.Value类型有一个方法IsNil,通过它先预判一遍,空的就返回,或者反射创建对象(后续go 反射 进阶会细说)
  2. 结构体字段首字母大小写:如果你结构体中某个字段不能canset,并且你valueof目标结构体的指针再elem进行canset,第一反应应该是检查大小写(大小写也是流畅控制是否暴露内部字段的重要技巧)
    现在你就学会了go 反射的基础技能了,能使用反射识别类型,和赋值。如果操练此文时遇见什么问题google也无解的,可私信我,一起学习交流交流

相关文章:

[go 反射] 入门

[go 反射] 入门 首先认识go 反射的两大概念&#xff0c;反射之路少不了他们 reflect.Type(接口)获取类型&#xff0c;和列名就找它reflect.Value(结构体)获取值&#xff0c;设置值找它 [tips] 通常是用这两者手底下的方法&#xff0c;reflect.Value结构体中有什么自行查看 …...

【计算机网络】数据链路层-MAC和ARP协议

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

本周三商店更新:多款套装下线,四款升级武器带异色皮肤返厂

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

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、…...

国际阿里云服务器买哪种好用点?

在当时数字化年代&#xff0c;云核算已经成为了企业进行事务运营和数据存储的重要东西。而阿里云作为我国最大的云核算服务供给商&#xff0c;其服务器产品线也适当丰厚。那么&#xff0c;对于用户来说&#xff0c;阿里云服务器买哪种好用点呢&#xff1f;这需求依据个人和企业…...

2023NOIP A层联测25 总结

T1 让你构造 40 40 40\times40 4040 的只含 r,y,x 的矩阵&#xff0c;含有 r y x ryx ryx 的个数恰好为 n n n&#xff0c; n ≤ 2222 n\le2222 n≤2222。看完题后就开始想构造&#xff0c;一开始想构造 3 ∗ 3 3*3 3∗3, 5 ∗ 5 5*5 5∗5 的单位矩阵的&#xff0c;但是始…...

Thread类的基本操作(JAVA多线程)

线程是操作系统中的概念&#xff0c;操作系统内核实现了线程这样的机制&#xff0c;并提供了一些API供外部使用。 JAVA中 Thread类 将系统提供的API又近一步进行了抽象和封装&#xff0c;所以如果想要使用多线程就离不开 Thread 这个类。 线程的创建(Thread类) 在JAVA中 创建…...

Redis 的三种部署模式

提前叠个 buff&#xff1a;这个文章不涉及图&#xff08;画起来比较麻烦&#xff09;&#xff0c;只是记录我的胡思乱想。 redis 从单点 -> 集群总共有三个部署模式&#xff1a;单机模式&#xff0c;主从模式&#xff0c;哨兵模式&#xff0c;集群模式 单机模式 新手入门模…...

【ArcGIS Pro二次开发】(73):使用NPOI库操作Excel

NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。 NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 相较于之前使用的Microsoft.Office.Interop.Excel&#xff0c;已经感觉到的优势&#xff0c;一是读写速度较快&#xff0c;虽然小数据量的读…...

python获取电脑所连接的wifi密码

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

动态壁纸软件Live Wallpaper HD mac中文版功能特色

Live Wallpaper HD mac提供了一系列美丽的主题场景&#xff0c;将为您的桌面增添活力。从城市景观、日落到遥远的星系&#xff0c;每个屏幕都有特别的触感&#xff0c;可以定制您的天气小部件和时钟样式&#xff0c;并使用您喜爱的图片创建您自己的个性化壁纸。 Living Wallpap…...

Spring Boot 配置主从数据库实现读写分离

一、前言 现在的 Web 应用大都是读多写少。除了缓存以外还可以通过数据库 “主从复制” 架构&#xff0c;把读请求路由到从数据库节点上&#xff0c;实现读写分离&#xff0c;从而大大提高应用的吞吐量。 通常&#xff0c;我们在 Spring Boot 中只会用到一个数据源&#xff0…...

【MongoDB】索引 - 单字段索引

MongoDB支持在集合文档中的任意字段上创建索引&#xff0c;默认情况下所有的集合都有一个_id字段的索引&#xff0c;用户和应用可以新增索引用于查询和操作。 一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, clas…...

评估大型语言模型:综述

论文地址&#xff1a;https://arxiv.org/pdf/2310.19736v2.pdf github&#xff1a; tjunlp-lab/awesome-llms-evaluation-… 发表团队&#xff1a;Tianjin University 摘要 将LLM评估划分三点&#xff1a;知识和能力评估、一致性评估和安全性评估。特定领域化评估benchmark评…...

设计模式之工厂模式(Factory)

任何可以产生对象的方法或类&#xff0c;都可以称为工厂。 下面的代码定义了Car这种交通工具: public class Car {public void go() {System.out.println("Car go wuwuwuwuw....");} }然后在main函数里面想要调用调用Car的go方法&#xff0c;就需要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 引擎&#xff0c;它可以帮助开发人员快速构建和部署现代应用程序的后端。它提供了一个自动化的 GraphQL API &#xff0c;可以直接连接到现有的数据库&#xff0c;并提供实时数据推送和订阅功能。 Hasura 团队总部位于印度。 下载安装 脚本…...

Javascript知识点详解:this关键字的指向问题

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

数据库的备份和恢复

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

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...