103

これが私が現在使用しているもので、これでうまくいくと思いますが、もっと良い方法があるはずです:

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

ご覧のとおり、私の場合、知る必要があるのはウィンドウを検出する方法だけですが、プラットフォーム/OS を検出する方法を知りたいです。

遊ぶ:

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

4

6 に答える 6

180

コンパイル時の検出

OS に応じて異なる実装を行うためにこれを行っている場合は、その機能の実装を含む別のファイルを用意し、各ファイルにビルド タグを追加する方が便利です。これは、osパッケージなど、標準ライブラリの多くの場所で使用されています。

これらのいわゆる「ビルド制約」または「ビルド タグ」については、こちらで説明しています。

定数がPATH_SEPARATORあり、プラットフォームに依存する必要があるとします。Windows 用と (UNIX) 残り用の 2 つのファイルを作成します。

/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 const があります: http://golang.org/pkg/runtime/#pkg-constants

于 2013-11-07T22:13:29.410 に答える