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

[go 反射] 进阶

[go 反射] 进阶

本文你将了解

  1. 反射拷贝指针
  2. 通过反射创建对象
  3. 将panic风险尽可能降低

反射拷贝指针秘诀在于将任何指针都想象成一个普通的uint64整数类型

import ("fmt""reflect"
)
func main(){var one,two *int=new(int),nil*one=23//现在要将one的指针拷贝给two,让它们指向相同的内存tvl:=reflect.ValueOf(&two).Elem()ovl:=reflect.ValueOf(one)if tvl.CanSet(){tvl.Set(ovl)*two=26fmt.Println(*one,*two)//两者都是26}
}

反射创建对象有时候对于未定义的指针想给它new个对象,这时候咋们的反射创建就来了

import("fmt""reflect"
)
func main(){var one *int =nilovl:=reflect.ValueOf(&one).Elem()if ovl.IsNil(){fmt.Println("is nil. create new object")if ovl.CanSet(){ovl.Set(reflect.New(reflect.TypeOf(one).Elem()))//注意type后面一定elem,因为type出来是*in,我们这里要new的是int,参数更不能传*one,因为one此时就是个空指针*one=23fmt.Println(*one)}}
}

panic风险尽可能将到最低
大多数我们用到反射以主流为参数的场景可能是这样的func(any,any)error.所以为了避免未知的意外panic,做到每一步都知道你在做什么

func totest(src any)(err error){stp:=reflect.TypeOf(src)switch stp.Kind(){//列出来哪些类型做哪些特殊处理,只处理预料之类的case reflect.Pointer://pointer类型就可能出现空指针的情况,进行空指针判断case reflect.Struct:case reflect.Int:default:err=errors.New("don't support kind "+stp.Kind().String())}return}

相关文章:

  • C++ 信息学奥赛 2046:【例5.15】替换字母
  • 2024天津理工大学中环信息学院专升本机械设计制造自动化专业考纲
  • C#学习相关系列之常用符号介绍
  • npm ERR! network ‘proxy‘ config is set properly. See: ‘npm help config解决方法
  • HarmonyOS UI 开发
  • Excel【毫秒】/【秒】转换成【时分秒】/【分秒】
  • 【C语法学习】18 - fread()函数
  • Java 语言环境搭建
  • ch579串口编程笔记
  • 婴儿专用洗衣机哪个牌子比较好?婴儿专用洗衣机哪个牌子比较好
  • CODESYS开发教程12-任务配置
  • Spring底层原理学习笔记--第二讲--(BeanFactory实现与ApplicaitonContext实现)
  • Oracle(10)Managing Undo Data
  • 【服务器使用】vscode winscp进行服务器容器连接(含修改初始密码)
  • maven之pom文件详解
  • [deviceone开发]-do_Webview的基本示例
  • crontab执行失败的多种原因
  • CSS居中完全指南——构建CSS居中决策树
  • HashMap ConcurrentHashMap
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS | NSProxy
  • MQ框架的比较
  • nodejs:开发并发布一个nodejs包
  • Terraform入门 - 1. 安装Terraform
  • vue数据传递--我有特殊的实现技巧
  • 测试开发系类之接口自动化测试
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 蓝海存储开关机注意事项总结
  • 类orAPI - 收藏集 - 掘金
  • 入门到放弃node系列之Hello Word篇
  • NLPIR智能语义技术让大数据挖掘更简单
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #Z2294. 打印树的直径
  • $.ajax中的eval及dataType
  • (70min)字节暑假实习二面(已挂)
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (接口自动化)Python3操作MySQL数据库
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)Neo4j下载安装以及初次使用
  • (转)人的集合论——移山之道
  • (转)原始图像数据和PDF中的图像数据
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ./和../以及/和~之间的区别
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [<死锁专题>]
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [android] 请求码和结果码的作用