理解 Go 的 unintptr、unsafe.Pointer、*type
概念
*type: 用于传递对象地址, 无法进行指针运算unsafe.Pointer: 通用指针, 用于表示任意类型的指针, 无法进行指针运算, 无法读取存储的值,可作为对象引用- 任意类型的指针可以转换为
unsafe.Pointer unsafe.Pointer可以转换为任意类型的指针- 可以和
unintptr互相转换 - 可比较, 支持与 nil 常量判断比较是否为空指针
- 任意类型的指针可以转换为
unintptr: 可指针运算,由于其无法持有对象,GC不把unintptr当作指针,unintptr常被回收- 实际上
unintptr就是一个整型值, 即便存储某个对象的内存地址, 也不算是对对象的引用
- 实际上
因为只有
unintptr可以参与指针的运算, 所以常常与unsafe.Pointer配合, 将普通类型指针转换为
unintptr来完成指针运算。