103

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

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

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

玩:

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

4

6 回答 6

180

编译时检测

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

这些所谓的“构建约束”或“构建标签”在此处进行了解释。

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

于 2013-11-07T22:19:49.657 回答
20

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

于 2013-11-07T22:13:29.410 回答
1

我只是偶然发现了这个寻找别的东西,并注意到这篇文章的年龄,所以我会添加一个更新的内容。如果您只是想处理正确的文件路径,我会使用filepath.Join()。它消除了操作系统问题的所有猜测。如果您需要更多内容,而不仅仅是文件路径,则可以使用运行时常量 ( runtime.GOOS& runtime.GOARCH):playground example

于 2020-04-15T16:11:06.320 回答
1

我在 Go 1.17.1 中进行了测试,这确实对我有用。

package main

import (
        "fmt"
        "runtime"
)
func main(){
        fmt.Println(runtime.GOOS)
}

Output:
darwin
于 2021-12-14T06:13:30.943 回答
1

由于这是一个较旧的问题和答案,我找到了另一种解决方案。

您可以简单地使用os包中定义的常量。此 const 返回 arune因此您还需要使用字符串转换。

string(os.PathSeparator)
string(os.PathListSeparator)

示例: https: //play.golang.org/p/g6jnF7W5_pJ

于 2021-04-29T16:04:34.680 回答
0

关于检测平台,您可以使用Distribution Detector 项目来检测正在运行的 Linux 发行版。

于 2021-01-02T18:57:19.350 回答