go unsafe.Pointer 与 uintptr

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类型的值,反之亦然。

 

你可能感兴趣的:(后台,go)