小编典典

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

go

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

func isWindows() bool {
    return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}

如您所见,就我而言,我只需要知道如何检测 Windows,但我想知道检测任何平台/操作系统的方法。


阅读 373

收藏
2021-12-06

共1个答案

小编典典

编译时检测

如果您这样做是为了根据操作系统有不同的实现,那么使用具有该功能实现的单独文件并将构建标记添加到每个文件会更有用。这在标准库的很多地方都有使用,例如os包中

这些所谓的“构建约束”或“构建标签”在此处进行了解释。

假设你有一个常量PATH_SEPARATOR并且你想要依赖于平台,你会制作两个文件,一个用于 Windows,一个用于 (UNIX) rest:

/project/path_windows.go
/project/path_unix.go

这些文件的代码将是:

path_windows.go

// +build windows

package project

const PATH_SEPARATOR = '\\'

path_unix.go

// +build !windows

package project

const PATH_SEPARATOR = '/'

您现在可以访问PATH_SEPARATOR您的代码并使其依赖于平台。

运行时检测

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

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

虽然它被编译到运行时中并因此忽略环境,但您仍然可以相对确定该值是正确的。这样做的原因是每个值得区分的平台由于不同的可执行格式需要重新构建,从而具有新的GOOS价值。

2021-12-06