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

新手上路,请多包涵

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

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

如您所见,在我的例子中,我只需要知道如何检测窗口,但我想知道检测任何平台/操作系统的方法。

玩:

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

原文由 mdwhatcott 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 796
2 个回答

编译时检测

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

这些所谓的“Build constraints”或“Build tags”在 这里 解释。

假设您有常量 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 值。

原文由 nemo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题