如何可靠地检测Go中的os / platform

时间:2013-11-07 22:02:09

标签: operating-system go

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

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

正如您所看到的,在我的情况下,我需要知道的是如何检测窗口,但我想知道检测任何平台/操作系统的方法。

玩:

http://play.golang.org/p/r4lYWDJDxL

5 个答案:

答案 0 :(得分:96)

编译时检测

如果您根据操作系统执行此操作以实现不同的实现,则更有用 具有该功能的实现的单独文件,并为每个文件添加构建标记 的文件。这在标准库中的许多位置使用,例如in the os package

这些所谓的“构建约束”或“构建标记”解释为here

假设您有常量PATH_SEPARATOR,并且您希望该平台依赖于您 将制作两个文件,一个用于Windows,另一个用于(unix)休息:

/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值。

答案 1 :(得分:11)

你看过运行时包吗?它的成本很高:{{3p>

答案 2 :(得分:0)

我偶然发现了这个问题,并注意到了这篇文章的年代,所以我将添加更多更新的内容。如果您只是想处理正确的文件路径,则可以使用filepath.Join()。它消除了操作系统问题中的所有猜测。如果除了文件路径之外,还需要更多的东西,可以使用运行时常量(runtime.GOOSruntime.GOARCH):playground example

答案 3 :(得分:0)

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

答案 4 :(得分:0)

由于这是一个较旧的问题和答案,我找到了另一个解决方案。

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

string(os.PathSeparator)
string(os.PathListSeparator)

示例:https://play.golang.org/p/g6jnF7W5_pJ