为什么Go语言中存在int类型

13

Golang 中有 int, int32, int64

int32 has 32 bits,
int64 has 64 bits,
int has 32 or 64 or different number of bits according to the environment.

我认为程序使用 int32int64 完全足够了。我不知道为什么会存在 int 类型,它难道不会使我们的代码行为更难以预测吗?

而且在 C++ 中,类型 int 和类型 long 长度是不确定的。我认为这会使我们的程序变得脆弱。我感到很困惑。

4个回答

6
通常情况下,int 的大小等于目标平台的自然字长。因此,如果您的程序不关心 int 的大小(最小的 int 范围足够),它可以在各种编译器上表现最佳。
当您需要特定大小时,您当然可以使用 int32 等。

6
通常每个平台的最佳操作方式是使用其本地大小的整数类型。通过使用简单的“int”,您告诉编译器您并不真正关心要使用哪种位宽,而是让它选择可以最快速度运行的那一个。请注意,您始终希望编写代码尽可能与平台无关......另一方面,“int32” / “int64”类型非常有用,如果您需要整数具有特定的大小,则这可能很有用。如果您想保存二进制文件(不要忘记端序),或者如果您有大型整数数组(仅将达到32b值),其中节省一半内存将是重要的等等。

3
在Go 1.0及以下版本中,int只是int32的同义词——32位整数。由于int用于索引切片,这阻止了切片具有超过20亿个元素左右。
在Go 1.1中,int在64位平台上被扩展为64位, 因此足以索引适合主存储器的任何切片。 因此:
  • int32是32位整数的类型;
  • int64是64位整数的类型;
  • int是可以索引所有可能的切片的最小整数类型。
实际上,int对于大多数实际用途而言已经足够大。仅在操作大于最大可能切片索引的值时才需要使用int64,而当不需要更大范围时,使用int32有助于节省内存并减少内存流量。

1
这个问题的根本原因是数组可寻址性。如果你需要调用make([]byte, 5e9),你的32位可执行文件将无法满足要求,而你的64位可执行文件可以继续运行。在32位构建中使用int64寻址一个数组是浪费的。在64位构建中使用int32寻址一个数组是不够的。使用int,你可以在两种架构上将一个数组寻址到其最大分配大小,而不必使用int32/int64的区别编码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接