英文:
How do I determine whether the program was built as 32 bit or 64 bit in Go?
问题
我能找到的最接近的是runtime.GOARCH
,但它可能会返回arm
,而arm
既可以是32位也可以是64位。
我只关心这个程序是如何构建的,而不关心操作系统是否支持64位可执行文件。例如,在AArch64 CPU上的ARM模式或x86-64 CPU上的32位兼容模式下,我仍然希望得到32位,因为这是程序运行的模式。
相关链接:https://stackoverflow.com/questions/66254265/detect-os-x86-or-x64-when-compiled-as-x86-in-go 是关于检测操作系统支持的内容,例如可能运行不同编译的可执行文件。
英文:
The closest I can get is runtime.GOARCH
, but that might also give arm
, which could be either 32 or 64 bit.
I only care how this program was built, not whether the OS also supports 64-bit executables. e.g. for ARM mode on an AArch64 CPU or 32-bit compat mode on an x86-64 CPU, I still want 32 because that's the mode this program is running in.
Related: https://stackoverflow.com/questions/66254265/detect-os-x86-or-x64-when-compiled-as-x86-in-go is about detecting what the OS supports, e.g. for maybe running a differently-compiled executable.
答案1
得分: 6
使用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
英文:
Use GOARCH for arm: arm (ARM) and arm64 (AArch64),
> Optional environment variables
>
> $GOOS and $GOARCH
>
> The name of the target operating system and compilation architecture.
> These default to the values of $GOHOSTOS and $GOHOSTARCH respectively
> (described below).
>
> Choices for $GOOS are
>
> $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
答案2
得分: 3
const is64Bit = uint64(^uintptr(0)) == ^uint64(0)
这段代码的作用是判断当前系统是否为64位。如果 uintptr
是32位,^uintptr(0)
的结果将是 0xffffffff
而不是 0xffffffffffffffff
。
无论是32位还是64位架构,^uint64(0)
的结果始终是 0xffffffffffffffff
。
英文:
const is64Bit = uint64(^uintptr(0)) == ^uint64(0)
This works because if uintptr
is 32 bits, ^uintptr(0)
will be 0xffffffff
rather than 0xffffffffffffffff
.
^uint64(0)
will always be 0xffffffffffffffff
regardless of 32 or 64 bit architectures.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论