这是我目前正在使用的,我认为可以完成工作,但必须有更好的方法:
func isWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
如您所见,就我而言,我只需要知道如何检测窗口,但我想知道检测任何平台/操作系统的方法。
玩:
这是我目前正在使用的,我认为可以完成工作,但必须有更好的方法:
func isWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
如您所见,就我而言,我只需要知道如何检测窗口,但我想知道检测任何平台/操作系统的方法。
玩:
如果您这样做是为了根据操作系统有不同的实现,那么拥有具有该功能实现的单独文件并将构建标签添加到每个文件会更有用。这在标准库中的许多地方都有使用,例如在os
package中。
这些所谓的“构建约束”或“构建标签”在此处进行了解释。
假设您有常量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
价值。
你看过运行时包吗?它有一个 GOOS 常量: http: //golang.org/pkg/runtime/#pkg-constants
我只是偶然发现了这个寻找别的东西,并注意到这篇文章的年龄,所以我会添加一个更新的内容。如果您只是想处理正确的文件路径,我会使用filepath.Join()。它消除了操作系统问题的所有猜测。如果您需要更多内容,而不仅仅是文件路径,则可以使用运行时常量 ( runtime.GOOS
& runtime.GOARCH
):playground example
我在 Go 1.17.1 中进行了测试,这确实对我有用。
package main
import (
"fmt"
"runtime"
)
func main(){
fmt.Println(runtime.GOOS)
}
Output:
darwin
由于这是一个较旧的问题和答案,我找到了另一种解决方案。
您可以简单地使用os包中定义的常量。此 const 返回 arune
因此您还需要使用字符串转换。
string(os.PathSeparator)
string(os.PathListSeparator)
示例: https: //play.golang.org/p/g6jnF7W5_pJ
关于检测平台,您可以使用Distribution Detector 项目来检测正在运行的 Linux 发行版。