Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定程序在Go中构建为32位还是64位?_Go_32bit 64bit - Fatal编程技术网

如何确定程序在Go中构建为32位还是64位?

如何确定程序在Go中构建为32位还是64位?,go,32bit-64bit,Go,32bit 64bit,我能得到的最接近的是runtime.GOARCH,但这也可能给出arm,它可以是32位或64位 我只关心这个程序是如何构建的,而不关心操作系统是否也支持64位可执行文件。e、 g.对于AArch64 CPU上的ARM模式或x86-64 CPU上的32位compat模式,我仍然需要32位,因为这是程序运行的模式 相关:是关于检测操作系统支持什么,例如可能运行不同编译的可执行文件。对arm使用GOARCH:arm(arm)和arm64(AARC64) $GOOS和$GOARCH 目标操作系统和编

我能得到的最接近的是
runtime.GOARCH
,但这也可能给出
arm
,它可以是32位或64位


我只关心这个程序是如何构建的,而不关心操作系统是否也支持64位可执行文件。e、 g.对于AArch64 CPU上的ARM模式或x86-64 CPU上的32位compat模式,我仍然需要32位,因为这是程序运行的模式

相关:是关于检测操作系统支持什么,例如可能运行不同编译的可执行文件。

对arm使用GOARCH:arm(arm)和arm64(AARC64)

$GOOS和$GOARCH

目标操作系统和编译体系结构的名称。 这些默认值分别为$GOHOSTOS和$GOHOSTARCH (如下所述)

$GOOS的选择是

$GOOS     $GOARCH
darwin    386
darwin    amd64
darwin    arm
darwin    arm64
dragonfly     amd64
freebsd   386
freebsd   amd64
freebsd   arm
linux     386
linux     amd64
linux     arm
linux     arm64
linux     ppc64
linux     ppc64le
linux     mips64
linux     mips64le
netbsd    386
netbsd    amd64
netbsd    arm
openbsd   386
openbsd   amd64
openbsd   arm
plan9     386
plan9     amd64
solaris   amd64
windows   386
windows   amd64
将GOARCH用于arm:arm(arm)和arm64(AArch64)

$GOOS和$GOARCH

目标操作系统和编译体系结构的名称。 这些默认值分别为$GOHOSTOS和$GOHOSTARCH (如下所述)

$GOOS的选择是

$GOOS     $GOARCH
darwin    386
darwin    amd64
darwin    arm
darwin    arm64
dragonfly     amd64
freebsd   386
freebsd   amd64
freebsd   arm
linux     386
linux     amd64
linux     arm
linux     arm64
linux     ppc64
linux     ppc64le
linux     mips64
linux     mips64le
netbsd    386
netbsd    amd64
netbsd    arm
openbsd   386
openbsd   amd64
openbsd   arm
plan9     386
plan9     amd64
solaris   amd64
windows   386
windows   amd64
常量为64位=uint64(^uintpttr(0))==^uint64(0)
这是因为如果
uintptr
是32位,
^uintpttr(0)
将是
0xffffffff
而不是
0xffffffffffff

^uint64(0)
将始终是
0xffffffffffffff
,无论是32位还是64位体系结构。

常量为64位=uint64(^uintpttr(0))==^uint64(0)
这是因为如果
uintptr
是32位,
^uintpttr(0)
将是
0xffffffff
而不是
0xffffffffffff


^uint64(0)
将始终是
0xffffffffffff
,而不管是32位还是64位体系结构。

IIUC,
runtime.GOARCH
将返回正在执行的生成程序的体系结构。由于一些拱门,即Intel/AMD的64位ISA,允许在64位内核上运行32位程序,因此如果OP真的想知道当前执行Go程序的操作系统的体系结构,那么解决这个问题的方法应该是不同的(而且,恐怕是平台特定的),
runtime.GOARCH
将返回正在执行的构建程序的体系结构。由于一些拱门,即Intel/AMD的64位ISA,允许在64位内核上运行32位程序,因此如果OP真的想知道当前执行Go程序的操作系统的体系结构,那么解决这个问题的方法应该是不同的(而且,恐怕是平台特定的).
runtime.GOARCH
将为您提供编译程序要运行的体系结构。要获得实际系统的体系结构细节,您可能最终必须检查
runtime.GOOS
,并执行特定于平台的系统调用。这个问题最初看起来像是关于检测操作系统,但答案(包括公认的答案)是关于检测编译器目标位的。我对它进行了编辑,以使问题与答案相匹配,因为这也是一件可能有用的事情。这就是为什么会有关于此检测的评论与操作系统不匹配。
runtime.GOARCH
将为您提供编译程序要运行的体系结构。要获得实际系统的体系结构细节,您可能最终必须检查
runtime.GOOS
,并执行特定于平台的系统调用。这个问题最初看起来像是关于检测操作系统,但答案(包括公认的答案)是关于检测编译器目标位的。我对它进行了编辑,以使问题与答案相匹配,因为这也是一件可能有用的事情。这就是为什么会有关于此检测的评论与操作系统不匹配。
uintptr
在32位代码中不总是32位的,即使在64位操作系统下运行也是如此吗?(例如,x86-64长模式内核下的i386代码,或AARC64内核下的ARM32代码,是这方面的主要现实使用案例。例如,您想知道可以运行另一个可执行文件的哪个版本。)但显然,这正是这个问题的实际需要,给出了公认的答案。所以我将重新回答这个问题。请注意,即使对于64位模式下的ILP32 ABI,这也将报告非64位。因此,这有助于确定指针是否为64位,但不能确定64位整数是否可以完全高效地完成。(例如,AArch64 ILP32在64位模式下使用32位指针以节省空间,与x86-64相同)Hmm有趣。然后,也许第二次测试
uint64(^uint(0))==^uint64(0)
会给出一个更完整的画面。我不希望
uint
是64位的,如果Go像C编译器一样调整大小,则选择
unsigned int
的大小。我希望像x32这样的ILP32 ABI也会有32位的
uint
。即使在64位操作系统下运行,32位代码中的
uintptr
不是总是32位的吗?(例如,x86-64长模式内核下的i386代码,或AARC64内核下的ARM32代码,是这方面的主要现实使用案例。例如,您想知道可以运行另一个可执行文件的哪个版本。)但显然,这正是这个问题的实际需要,给出了公认的答案。所以我将重新回答这个问题。请注意,即使对于64位模式下的ILP32 ABI,这也将报告非64位。因此,这有助于确定指针是否为64位,但不能确定64位整数是否可以完全高效地完成。(例如,AArch64 ILP32在64位模式下使用32位指针以节省空间,与x86-64相同)Hmm有趣。然后,也许第二次测试
uint64(^uint(0))==^uint64(0)
会给出一个更完整的画面。我不希望
uint
是64位的,如果Go像C编译器一样调整大小,则选择
unsigned int
的大小。我希望像x32这样的ILP32 ABI也会有32位的
uint