1. ホーム
  2. operating-system

[解決済み] Goでos/platformを確実に検出する方法

2022-11-10 14:59:16

質問

現在、私が使っているものは以下のとおりです。これで仕事ができると思うのですが、もっといい方法があるはずです。

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

ご覧の通り、私の場合はWindowsを検出する方法しか知りませんが、あらゆるプラットフォーム/OSを検出する方法を知りたいと思います。

再生します。

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

どのように解決するのですか?

コンパイル時の検出

OS によって異なる実装をする場合、その機能を実装したファイルを別々に用意し、それぞれにビルドタグを追加する方が便利です。 その機能を実装した別々のファイルを用意し、それぞれのファイルにビルド タグを追加する方が便利です。 を追加するのが便利です。これは標準ライブラリの多くの場所で使われていて、例えば の中の os パッケージ .

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

例えば、定数 PATH_SEPARATOR があり、それをプラットフォームに依存させたい場合 は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 の値を変更する必要があるからです。