Operating system 如何在Go中可靠地检测操作系统/平台

Operating system 如何在Go中可靠地检测操作系统/平台,operating-system,go,Operating System,Go,以下是我目前使用的方法,我认为可以完成工作,但必须有更好的方法: func isWindows() bool { return os.PathSeparator == '\\' && os.PathListSeparator == ';' } 如您所见,在我的例子中,我需要知道的只是如何检测windows,但我想知道检测任何平台/操作系统的方法 播放: 您看过运行时包了吗?它在编译时有一个GOOS常量:检测 如果您这样做是为了根据操作系统的不同而有不同的实现,那么 使用

以下是我目前使用的方法,我认为可以完成工作,但必须有更好的方法:

func isWindows() bool {
    return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
如您所见,在我的例子中,我需要知道的只是如何检测windows,但我想知道检测任何平台/操作系统的方法

播放:


您看过运行时包了吗?它在编译时有一个GOOS常量:

检测 如果您这样做是为了根据操作系统的不同而有不同的实现,那么 使用该功能的实现创建单独的文件,并为每个文件添加构建标记 所有的文件。例如,这在标准库的许多地方都使用

本文解释了这些所谓的“构建约束”或“构建标记”

假设您拥有常量
路径分隔符
,并且希望该平台依赖于您 将生成两个文件,一个用于windows,另一个用于(unix)其余文件:

这些文件的代码将是:

path_windows.go path_unix.go 现在,您可以访问代码中的
路径分隔符
,并使其依赖于平台

运行时检测 如果要在运行时确定操作系统,请使用 变量:

if runtime.GOOS == "windows" {
    fmt.Println("Hello from Windows")
}
虽然这会被编译到运行时中,因此会忽略环境, 不过,您可以相对确定该值是否正确。 原因是每一个值得区分的平台都需要
由于不同的可执行格式而重建,因此有了一个新的
GOOS

值。

我只是偶然发现这篇文章在寻找其他东西,并注意到了这篇文章的年代,所以我将添加一个更新的内容。如果您只是试图处理我将使用的正确文件路径。它消除了操作系统问题的所有猜测。如果除了文件路径之外,您还需要使用运行时常量(
runtime.GOOS
&
runtime.GOARCH
)来检测平台:

关于检测平台,您可以使用来检测正在运行的Linux发行版。

因为这是一个较老的问题和答案,我找到了另一个解决方案

您可以简单地使用包中定义的常量。这个常量返回一个
符文
,因此您还需要使用字符串转换

字符串(os.PathSeparator)
字符串(os.PathListSeparator)

示例:

GOOS,在运行时包中,在编译时设置,并且在没有安装Go工具的情况下可读。@Matt您正在考虑环境变量@Tyler正在使用
runtime.GOOS
,它可以很好地工作,例如:当前版本的Windows使用Posix分隔符(即“/”)可以很好地运行。对于bat脚本和旧的非Posix版本的Windows,您只需要反斜杠。您能定义“当前”吗?就在最近几周,我被硬编码“/”烧坏了……Windows95、98ME和所有早期版本都需要反斜杠。Windows 2000、NT和更高版本接受反斜杠和正斜杠作为等效项。反斜杠提供了与旧版本的兼容性,而正斜杠提供了Posix兼容性。感谢@Rick-777的澄清。我试图运行此命令,但我遇到了某种奇怪的错误。路径\窗口。转到:4:24:在此块中重新声明的路径\分隔符。在path_unix.go:4:24之前的声明,我就是不明白。。。编译器不明白吗?@RamonJ.A.Smit您需要向这些文件添加生成约束,如下所示:path_unix.go应该有
/+build!windows
和path_windows.go应具有
/+build windows
。我编辑了上面的答案以显示他们应该去哪里。它们必须出现在
程序包
语句之前,后面必须有一个空行,这样它们就不会被解释为程序包的文档。感谢您的额外输入!我会玩这个。谢谢:-)此答案不显示如何检测平台。问题使用os.PathSeparator和os.PathListSeparator来检测窗口。
// +build windows

package project

const PATH_SEPARATOR = '\\'
// +build !windows

package project

const PATH_SEPARATOR = '/'
if runtime.GOOS == "windows" {
    fmt.Println("Hello from Windows")
}