我用来测试某些预期行为的应用程序的一小部分给出了不同的输出,这取决于我在什么处理器上运行它。下面是代码的相关部分:
for b := 0; b < intCounter; b++ {
//int64Random = rand.Int63()
int64Random = int64(rand.Int())
//CHECKING FOR SANITY
fmt.Println("int64Random is " + strconv.FormatInt(int64Random, 10))
slcTestNums = append(slcTestNums, int64Random)
}
当我在Mac (amd64, darwin)上运行此命令时,我得到如下输出:
int64Random is 2991558990735723489
int64Random is 7893058381743103687
int64Random is 7672635040537837613
int64Random is 1557718564618710869
int64Random is 2107352926413218802
当我在Pi (arm, linux)上运行此命令时,我得到如下输出:
int64Random is 1251459732
int64Random is 1316852782
int64Random is 971786136
int64Random is 1359359453
int64Random is 729066469
如果在Pi上将int64Random更改为= rand.Int63()并重新编译,则得到如下输出:
int64Random is 7160249008355881289
int64Random is 7184347289772016444
int64Random is 9201664581141930074
int64Random is 917219239600463359
int64Random is 6015348270214295654
…这与Mac得到的更接近。这是因为由于处理器架构在运行时发生了变化吗?为什么int64(rand.Int())
生成的是int64范围的数字,而不是保持一个int64范围的数字,而是改变存储它的变量的类型?我错过了提到这种行为的Go文档吗?
根据https://golang.org/doc/go1.1
语言允许实现选择是否为int类型而int类型是32位或64位。以前的Go实现是int在所有系统上都是32位。gc和gccgo实现现在在64位平台(如AMD64/x86-64)上使用int和uint 64位
rand.Int()返回int。在amd64上是64位,在ARM上是32位