Подтвердить что ты не робот

Как надежно обнаружить os/platform в Go

Вот то, что я использую в настоящее время, которое, я думаю, выполняет эту работу, но должен быть лучший способ:

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

Как вы можете видеть, в моем случае все, что мне нужно знать, - это как обнаружить окна, но я хотел бы знать способ обнаружения любой платформы /os.

Play:

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

4b9b3361

Ответ 1

Обнаружение во время компиляции

Если вы делаете это, чтобы иметь разные реализации в зависимости от ОС, более полезно иметь отдельные файлы с реализацией этой функции и добавлять теги сборки к каждому файлов. Это используется во многих местах стандартной библиотеки, например в пакете os.

Эти так называемые "ограничения сборки" или "теги сборки" объясняются здесь.

Скажите, что у вас есть константа PATH_SEPARATOR, и вы хотите, чтобы эта платформа зависела, вы сделал бы два файла, один для окон и один для отдыха (unix):

/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.