[Go] 理解 Go 的 unintptr、unsafe.Pointer、*type

发布时间 2023-06-17 15:55:23作者: keepyang

理解 Go 的 unintptr、unsafe.Pointer、*type

概念

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

因为只有 unintptr 可以参与指针的运算, 所以常常与 unsafe.Pointer 配合, 将普通类型指针转换为
unintptr 来完成指针运算。