当前位置:网站首页>golang 三种指针类型具体类型的指针、unsafe.Pointer、uintptr作用
golang 三种指针类型具体类型的指针、unsafe.Pointer、uintptr作用
2022-08-09 10:51:00 【ase2014】
总结
golang的三种指针类型
- 具体类型的指针,如*int、*string等
- unsafe.Pointer,在unsafe下面,任何具体类型的指针都能转化成Pointer,可以实现不同类型的指针的互相转化,充当桥梁的作用
- uintptr,golang源码的注释为能存储任何类型的指针的类型,uintptr可以进行指针计算,然后对对应的指针地址的变量进行复制,完成一些黑魔法
具体类型的指针
具体类型的指针,平时开发使用的很多,不同指针类型不能进行转化,主要用作参数
unsafe.Pointer
开发者开发过程使用的很少,在golang源码中使用的比较多,可以充当桥梁,实现不同类型的指针的转换
- 任何类型的指针可以转换成Pointer
- Pointer可以转换成任何类型的指针
- uintptr可以转换成Pointer
- Pointer可以转换成uintptr
uintptr
开发者开发过程使用的很少,在golang源码中使用的比较多,实现指针的计算
例子
实现struct里面的未导出的变量的赋值
Demo的内存存储结构:
demo/demo.go
type Demo struct {
a int32
b byte
c int64
}
main.go
打印出来为
&{1 97 2}
d := new(demo.Demo)
// 获取a的地址并转化为int32,然后进行赋值
*(*int32)(unsafe.Pointer(d)) = 1
// 获取b的地址,需要加上int32的地址,然后进行赋值
*(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(d)) + unsafe.Sizeof(int32(0)))) = 'a'
// 获取c的地址,需要加上int64的大小,因为进行了内存对齐,后续会弄一篇博客阐述内存对齐,大致就是按照最大的内存大小的内存对齐,下面就是int64的大小对齐,如下面的就是按照int64对齐,因为int32加上byte为5byte,比int64的8byte小,就只需要一个int64就行
*(*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(d)) + unsafe.Sizeof(int64(0)))) = 2
fmt.Println(d)
边栏推荐
- Tensorflow realize parameter adjustment of linear equations
- Create a table in a MySQL database through Doc
- 性能测试(01)-jmeter元件-线程组、调试取样器
- 批量转换经纬度的网页实现方法
- Netscope: Online visualization tool for neural network structures
- 力扣(LeetCode)220. 存在重复元素 III(2022.08.08)
- 性能测试(06)-逻辑控制器
- 一键完成物联网产品注册,快速体验在线调试设备
- 【原创】VMware Workstation实现Openwrt软路由功能,非ESXI,内容非常详细!
- Preparation for gold three silver four: how to successfully get an Ali offer (experience + interview questions + how to prepare)
猜你喜欢
图片查看器viewer
linux mysql操作的相关命令
shap库源码和代码实现
MySQL索引的B+树到底有多高?
OpenSSF's open source software risk assessment tool: Scorecards
Probably 95% of the people are still making PyTorch mistakes
Error: Cannot find module ‘./application‘
研发需求的验收标准应该怎么写? | 敏捷实践
Jmeter BeanShell post processor
Shell script combat (2nd edition) / People's Posts and Telecommunications Press Script 1 Find programs in the PATH
随机推荐
faster-rcnn学习
批量转换经纬度的网页实现方法
margin出bug---margin失效
RPN principle in faster-rcnn
golang runtime Caller、Callers、CallersFrames、FuncForPC、Stack作用
autogluon安装,使用指南,代码
详细的np.matmul / np.dot / np.multiply / tf.matmul / tf.multiply / *
AQS同步组件-ForkJoin、BlockingQueue阻塞队列解析和用例
cesium加载地图
torch.cat()函数的官方解释,详解以及例子
备战金三银四:如何成功拿到阿里offer(经历+面试题+如何准备)
MySQL和MyEclipse的数据库连接操作
The complete grammar of CSDN's markdown editor
【原创】解决阿里云oss-browser.exe双击没反应打不开,提供一种解决方案
Create a table in a MySQL database through Doc
自从我使用HiFlow场景连接器后,在也不用担心成为“落汤鸡”了
unix环境编程 第十四章 14.8 存储映射I/O
Unix Environment Programming Chapter 15 15.3 Functions popen and pclose
乘积量化(PQ)
Dialogue with the DPO of a multinational consumer brand: How to start with data security compliance?See you on 8.11 Live!