固定大小的整数
固定大小的整数需要精确的内存量。对单个变量“到处”使用较小的整数类型,您只会获得少量的内存(如果有的话)。此外,当用作结构体字段的类型时,由于隐式填充,您可能再次无法获得任何内容。
当您使用固定大小的整数作为(大)切片或数组的元素类型时,内存增益可能会非常明显且相当大。
使用固定大小整数的另一个(也许更重要)原因可能是为了传达您在其中存储的内容。你也可以使用int32
or int64
类型来存储字节,但显然是一种浪费,它们不传达有效范围其中存储的数据。
还有一点就是效率。你总是可以使用int64
代替其他有符号整数类型,但在某些架构上执行操作int64
可能需要多个寄存器操作,因此速度要慢得多。还有rune
类型(别名为int32
) 清楚地表明您打算将其用于 unicode 代码点。
另一点是一致性。如果你使用int32
要在一个地方建模某些东西,你应该坚持它并在所有地方使用相同的类型。这在 Go 中比在其他语言中更重要,因为 Go 的类型系统很严格(比大多数其他语言更严格),这意味着如果您有一个类型的值int32
,你不能将它分配给变量int64
类型,反之亦然,无需显式转换。
int
与固定大小整数
类型int
and uint
尺寸不是固定的,而是根据规格: 数字类型: https://golang.org/ref/spec#Numeric_types
uint either 32 or 64 bits
int same size as uint
当你使用int
,编译器在针对不同的体系结构时可能会生成更优化的代码。Usually int
当针对 32 位架构时为 32 位,当针对 64 位架构时为 64 位。这意味着尺寸int
将匹配目标体系结构的寄存器大小,因此可以使用单个寄存器操作有效地执行整数运算。如果你使用int64
例如,可能需要执行多个(寄存器)操作才能在 32 位架构上执行单个整数操作。
我喜欢想int
是一种整数类型,用于以它认为合适的最佳方式描述和传达 Go 运行时数据结构的某些部分或组件。例如,索引数组或切片,或描述它们的大小,int
是使用的“自然”类型。
规格: 长度及容量: https://golang.org/ref/spec#Length_and_capacity
内置函数len
and cap
接受各种类型的参数并返回类型的结果int
。该实现保证结果始终适合int
。例如索引切片或数组,或描述它们的长度和容量,int
是推荐或强制执行的“自然”类型。
当使用for range
数组、切片或上至少有一个迭代变量的语句string
值,迭代变量(“索引”)将是类型int
.
另请注意,Rob Pike 已提出一项关于 Go 2 更改的提案int
任意精度。提案:spec:将 int 更改为任意精度 https://github.com/golang/go/issues/19623