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

mdw*_*ott 66 operating-system go

这是我目前使用的,我认为完成工作,但必须有一个更好的方法:

func isWindows() bool {
    return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
Run Code Online (Sandbox Code Playgroud)

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

玩:

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

nem*_*emo 112

在编译时检测

如果您根据操作系统执行此操作以实现不同的实现,则使用该功能的实现来创建单独的文件并向每个文件添加构建标记会更有用.这在标准库中的许多地方使用,例如os包中.

这里解释所谓的"构建约束"或"构建标记" .

假设您有常量,PATH_SEPARATOR并且您希望该平台依赖,您将生成两个文件,一个用于Windows,另一个用于(unix)其余文件:

/project/path_windows.go
/project/path_unix.go
Run Code Online (Sandbox Code Playgroud)

这些文件的代码将是:

path_windows.go

// +build windows

package project

const PATH_SEPARATOR = '\\'
Run Code Online (Sandbox Code Playgroud)

path_unix.go

// +build !windows

package project

const PATH_SEPARATOR = '/'
Run Code Online (Sandbox Code Playgroud)

您现在可以访问PATH_SEPARATOR代码并使其与平台相关.

在运行时检测

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

if runtime.GOOS == "windows" {
    fmt.Println("Hello from Windows")
}
Run Code Online (Sandbox Code Playgroud)

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

  • @ RamonJ.A.Smit您需要像这样向这些文件添加构建约束:path_unix.go应该具有“ // + build!windows”和path_windows.go应该具有“ // + build Windows”。我编辑了上面的答案,以显示它们应该去的地方。它们必须在“ package”语句之前,并且后跟空白行,因此它们不会被解释为该软件包的文档。 (2认同)

Tyl*_*eto 15

你看过运行时包吗?它有一个GOOS const:http://golang.org/pkg/runtime/#pkg-constants

  • 运行时包中的GOOS在编译时设置,并且在没有安装Go工具的情况下可读. (2认同)
  • @Matt你在考虑环境变量.@Tyler的问题是'runtime.GOOS`,它可以很好地工作,例如:http://play.golang.org/p/0dDIEoFXfx (2认同)

Mat*_*att 11

现在是 2022 年,go 1.18+ 的正确答案是:

在运行时你想要:

if runtime.GOOS == "windows" {
  // windows specific code here...
}
Run Code Online (Sandbox Code Playgroud)

如果需要确定文件系统路径分隔符

使用:os.PathSeparator

例子:

  • c:\程序文件
  • /usr/local/bin

PATH如果您需要环境变量使用的路径列表分隔符

使用:os.PathListSeparator

例子:

  • /usr/local/bin:/usr/local:
  • "C:\windows";"c:\windows\system32";