欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

go unsafe.Pointer 与 uintptr

程序员文章站 2022-03-04 18:50:46
...

https://my.oschina.net/goal/blog/193698

https://my.oschina.net/xinxingegeya/blog/729673

https://my.oschina.net/achun/blog/122540

unsafe.Pointer

是实现定位预读写的内存基础。

(1)任何类型的指针都可以被转化为Pointer
(2)Pointer可以被转化为任何类型的指针
(3)uintptr可以被转化为Pointer
(4)Pointer可以被转化为uintptr

unsafe.Pointer指针指向的真实变量的值,因为我们并不知道变量的具体类型。和普通指针一样,unsafe.Pointer指针也是可以比较的,并且支持和nil常量比较判断是否为空指针。

一个普通的T类型指针可以被转化为unsafe.Pointer类型指针,并且一个unsafe.Pointer类型指针也可以被转回普通的指针,被转回普通的指针类型并不需要和原始的T类型相同。

可以利用unsafe.Pointer操作未导出的变量

可以表示任何可指向可寻址的值的指针。

unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算

uintptr

内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。

uintptr是用于指针运算的,GC 不把 uintptr 当指针,也就是说 uintptr 无法持有对象,uintptr类型的目标会被回收

 

区别

一个指针值如(*Dog类型的值)可以被转换为一个unsafe.Pointer类型的值,反之亦然

一个uintptr类型的值也可以被转换为一个unsafe.Pointer类型的值,反之亦然

一个指针值无法被直接转换成uintptr类型的值,反之亦然。