我们提供了以下整数类型:
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
理论上,这意味着我们还可以拥有指向所有这些类型的指针,如下所示:
*int *int8 *int16 *int32 *int64
*uint *uint8 *uint16 *uint32 *uint64 *uintptr
如果是这种情况,那么我们已经有了一个指向 *uint 形式的 uint 的指针。这将使 uintptr 变得多余。官方文档并没有对此给出太多说明:
uintptr is an integer type that is large enough to hold the bit pattern of any pointer.
据我了解,这意味着 uint 的位宽是在编译时根据目标体系结构(通常是 32 位或 64 位)确定的。指针宽度也应该缩放到目标体系结构似乎是合乎逻辑的(即:32 位 *uint 指向 32 位 uint)。Golang 也是这样吗?
另一个想法是,也许添加 uintptr 是为了使在进行多重间接寻址时语法不那么混乱(即:foo *uinptrvs foo **uint)?
我最后的想法是,也许指针和整数在 Golang 中是不兼容的数据类型。这将是相当令人沮丧的,因为硬件本身并不区分它们。例如,“分支到此地址”指令可以使用来自刚刚在“添加此值”指令中使用的同一寄存器的相同数据。
uintptr 的真正意义是什么(双关语)?
千巷猫影
素胚勾勒不出你
尚方宝剑之说