当前位置: 首页 > 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文件详解
  • 【Leetcode】101. 对称二叉树
  • 【5+】跨webview多页面 触发事件(二)
  • Angular 响应式表单 基础例子
  • Asm.js的简单介绍
  • CentOS 7 防火墙操作
  • E-HPC支持多队列管理和自动伸缩
  • js ES6 求数组的交集,并集,还有差集
  • linux安装openssl、swoole等扩展的具体步骤
  • mockjs让前端开发独立于后端
  • PHP 的 SAPI 是个什么东西
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Terraform入门 - 1. 安装Terraform
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 容器镜像
  • ​如何在iOS手机上查看应用日志
  • #{}和${}的区别?
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #stm32驱动外设模块总结w5500模块
  • $L^p$ 调和函数恒为零
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 中什么样的类是可使用 await 异步等待的?
  • [20190113]四校联考
  • [Android View] 可绘制形状 (Shape Xml)
  • [ARC066F]Contest with Drinks Hard
  • [C/C++随笔] char与unsigned char区别
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析
  • [hdu 3652] B-number
  • [IE编程] 如何获得IE版本号