我知道uintptr的大小与Go语言中的uint遵循相同的规则;我猜uint和uintptr是相同的,只是它们在用例中是不同的。那么为什么uintptr不是uint在go内置程序中的别名,就像byte是uint8的别名,rune是int32的别名一样?
uintptr
uint
uint8
rune
int32
y53ybaqx1#
根据Go语言规范,以下是如何定义“unsized”整数数据类型的大小:uint 32位或64位int与uint大小相同uintptr一个足够大的无符号整数,可以存储指针值的未解释位正如你所看到的,这两种类型都有一个 distinct 的大小定义。即使它们在大多数(?)平台上恰好是相同的大小,也没有语言级别的原因为什么要将这些类型合并。为指针整数指定不同类型还有一个好处:由于Go语言有严格的类型,你不能将uintptr作为任何其他int类型使用,除非先转换它。这很重要,因为uintptr在Go语言中主要用于unsafe目的,所以当你可能滥用不安全的功能时,有一个不同的类型会给出强烈的指示或错误(或者至少,它会让你三思而后行)。
unsafe
1条答案
按热度按时间y53ybaqx1#
根据Go语言规范,以下是如何定义“unsized”整数数据类型的大小:
uint 32位或64位
int与uint大小相同
uintptr一个足够大的无符号整数,可以存储指针值的未解释位
正如你所看到的,这两种类型都有一个 distinct 的大小定义。即使它们在大多数(?)平台上恰好是相同的大小,也没有语言级别的原因为什么要将这些类型合并。
为指针整数指定不同类型还有一个好处:由于Go语言有严格的类型,你不能将
uintptr
作为任何其他int类型使用,除非先转换它。这很重要,因为uintptr
在Go语言中主要用于unsafe
目的,所以当你可能滥用不安全的功能时,有一个不同的类型会给出强烈的指示或错误(或者至少,它会让你三思而后行)。