3 回答

TA贡献1829条经验 获得超7个赞
您正在混淆 uintptr 和 *uint。uintptr 在处理指针时使用,它是一种足够大以容纳指针的数据类型。它主要用于不安全的内存访问,查看unsafe包。*uint 是指向无符号整数的指针。

TA贡献1827条经验 获得超9个赞
简短的回答是“从不使用uintptr
”。😀
长的答案是,uintptr
是否可以绕过类型系统并允许 Go 实现者在 Go 中编写 Go 运行时库(包括垃圾收集系统),并调用 C 可调用代码,包括使用不被处理的 C 指针的系统调用。去吧。
如果您作为实施者(例如,提供对新操作系统上的系统调用的访问),您将需要uintptr
. 您还需要了解使用它所需的所有特殊魔法,例如,如果操作系统要对操作系统级线程执行堆栈式操作,则将 goroutine 锁定到操作系统级线程。(如果您将其与 Go 指针一起使用,您可能还需要告诉编译器不要移动您的 goroutine 堆栈,这是通过特殊的编译时指令完成的。)
运行时系统将 anunsafe.Pointer
视为对对象的引用,这使对象在 GC 中保持活动状态。它不认为 auintptr
是这样的参考。(也就是说,虽然unsafe.Pointer
有指针类型,但uintptr
有整数类型。)

TA贡献1788条经验 获得超4个赞
uintptr 只是内存地址的整数表示形式,无论它指向的实际类型是什么。有点像void *
C 语言,或者只是将指针转换为整数。它的目的是用于不安全的黑魔法,并且不会在日常的 go 代码中使用。
- 3 回答
- 0 关注
- 278 浏览
添加回答
举报