当前位置:网站首页>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)
边栏推荐
- OpenSSF的开源软件风险评估工具:Scorecards
- cnn的输入输出
- margin出bug---margin失效
- 【 original 】 VMware Workstation implementation Openwrt soft routing, the ESXI, content is very detailed!
- activemq 消息持久化
- linux mysql操作的相关命令
- TensorFlow: NameError: name 'input_data' is not defined
- Probably 95% of the people are still making PyTorch mistakes
- 详细的np.matmul / np.dot / np.multiply / tf.matmul / tf.multiply / *
- 研发需求的验收标准应该怎么写? | 敏捷实践
猜你喜欢
Solve the ali cloud oss - the original 】 【 exe double-click response can't open, to provide a solution
美的数字化平台 iBUILDING 背后的技术选型
为什么组合优先于继承
centos7.5 设置Mysql开机自启动
[Error record] Solve the problem that ASRock J3455-ITX cannot be turned on without a monitor plugged in
shell脚本实战(第2版)/人民邮电出版社 脚本1 在PATH中查找程序
2022年台湾省矢量数据(点线面)及数字高程数据下载
prometheus接入mysqld_exporter
Getting Started with MNIST Machine Learning
【原创】解决阿里云oss-browser.exe双击没反应打不开,提供一种解决方案
随机推荐
依赖注入(Dependency Injection)框架是如何实现的
ThreadLocal及其内存泄露分析
Shell script combat (2nd edition) / People's Posts and Telecommunications Press Script 2 Validate input: letters and numbers only
性能测试(01)-jmeter元件-线程组、调试取样器
如何在gazebo进行 joint的转动控制
在webgis中显示矢量化后的风险防控信息
activemq 消息持久化
unix系统编程 第十五章 15.2管道
爬虫实例,获取豆瓣上某部电影的评论
从位图到布隆过滤器
Quartz分布式实现
Invisible OOM in kubernetes
tensorflow实现线性方程的参数调整
【 original 】 VMware Workstation implementation Openwrt soft routing, the ESXI, content is very detailed!
真香!肝完Alibaba这份面试通关宝典,我成功拿下今年第15个Offer
margin出bug---margin失效
性能测试(03)-JDBC Request
The complete grammar of CSDN's markdown editor
C语言数组题_校门外的树_标记法
UNIX Environment Programming Chapter 15 15.6 XSI IPC