这是我当前正在使用的,我认为可以完成工作,但是必须有一种更好的方法:
func isWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
如您所见,在我的情况下,我只需要知道如何检测窗口即可,但是我想知道检测任何平台/操作系统的方法。
玩:
这是我当前正在使用的,我认为可以完成工作,但是必须有一种更好的方法:
func isWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
如您所见,在我的情况下,我只需要知道如何检测窗口即可,但是我想知道检测任何平台/操作系统的方法。
玩:
Answers:
如果要执行此操作以根据操作系统使用不同的实现,则具有实现该功能的单独文件并向每个文件添加构建标记会更有用。这在标准库的许多地方都使用过,例如在os
package中。
这些所谓的“构建约束”或“构建标签”在此处进行了说明。
假设您有常量,PATH_SEPARATOR
并且希望该平台依赖,您将制作两个文件,一个用于Windows,另一个用于(unix)其余部分:
/project/path_windows.go
/project/path_unix.go
这些文件的代码如下:
// +build windows
package project
const PATH_SEPARATOR = '\\'
// +build !windows
package project
const PATH_SEPARATOR = '/'
现在PATH_SEPARATOR
,您可以访问代码并使其依赖于平台。
如果要在运行时确定操作系统,请使用runtime.GOOS
变量:
if runtime.GOOS == "windows" {
fmt.Println("Hello from Windows")
}
尽管将其编译到运行时中并因此忽略了环境,但是您仍然可以相对确定该值正确。这样做的原因是,每个值得区分的平台都需要由于不同的可执行格式而需要重建,因此具有新的GOOS
价值。
// +build !windows
,path_windows.go应该具有// +build windows
。我编辑了上面的答案,以显示它们应该去的地方。它们必须在package
语句之前,并且后跟空白行,因此它们不会被解释为软件包的文档。
您是否看过运行时软件包?它具有GOOS常量:http : //golang.org/pkg/runtime/#pkg-constants
runtime.GOOS
正常使用,例如:play.golang.org/p/0dDIEoFXfx
我只是偶然发现了这个东西,然后注意到了这篇文章的年代,所以我将添加更多更新的内容。如果您只是想处理正确的文件路径,则可以使用filepath.Join()。它消除了操作系统问题中的所有猜测。如果除了文件路径之外,还需要更多的东西,那么可以使用运行时常量(runtime.GOOS
&runtime.GOARCH
):Playground示例