以下是我目前正在使用的内容,我认为可以完成工作,但必须有更好的方法:
func isWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
正如您所看到的,在我的情况下,我需要知道的是如何检测窗口,但我想知道检测任何平台/操作系统的方法。
玩:
答案 0 :(得分:96)
如果您根据操作系统执行此操作以实现不同的实现,则更有用
具有该功能的实现的单独文件,并为每个文件添加构建标记
的文件。这在标准库中的许多位置使用,例如in the os
package。
这些所谓的“构建约束”或“构建标记”解释为here。
假设您有常量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
值。
答案 1 :(得分:11)
你看过运行时包吗?它的成本很高:{{3p>
答案 2 :(得分:0)
我偶然发现了这个问题,并注意到了这篇文章的年代,所以我将添加更多更新的内容。如果您只是想处理正确的文件路径,则可以使用filepath.Join()。它消除了操作系统问题中的所有猜测。如果除了文件路径之外,还需要更多的东西,可以使用运行时常量(runtime.GOOS
和runtime.GOARCH
):playground example
答案 3 :(得分:0)
关于检测平台,您可以使用 Distribution Detector project 检测正在运行的 Linux 发行版。
答案 4 :(得分:0)
由于这是一个较旧的问题和答案,我找到了另一个解决方案。
您可以简单地使用 os 包中定义的常量。此常量返回 rune
,因此您还需要使用字符串转换。
string(os.PathSeparator)
string(os.PathListSeparator)