Folgendes verwende ich derzeit, was meiner Meinung nach die Arbeit erledigt, aber es muss einen besseren Weg geben:
func isWindows() bool {
return os.PathSeparator == '\\' && os.PathListSeparator == ';'
}
Wie Sie sehen können, muss ich in meinem Fall nur wissen, wie man Fenster erkennt, aber ich möchte wissen, wie man Plattformen / Betriebssysteme erkennt.
Abspielen:
operating-system
go
mdwhatcott
quelle
quelle
Antworten:
Erkennung zur Kompilierungszeit
Wenn Sie dies tun, um je nach Betriebssystem unterschiedliche Implementierungen zu haben, ist es sinnvoller, separate Dateien mit der Implementierung dieser Funktion zu haben und jeder der Dateien Build-Tags hinzuzufügen. Dies wird an vielen Stellen in der Standardbibliothek verwendet, beispielsweise im
os
Paket .Diese sogenannten "Build-Einschränkungen" oder "Build-Tags" werden hier erläutert .
Angenommen, Sie haben die Konstante
PATH_SEPARATOR
und möchten, dass diese Plattform abhängig ist. Sie würden zwei Dateien erstellen, eine für Windows und eine für den (Unix-) Rest:/project/path_windows.go /project/path_unix.go
Der Code dieser Dateien wäre dann:
path_windows.go
// +build windows package project const PATH_SEPARATOR = '\\'
path_unix.go
// +build !windows package project const PATH_SEPARATOR = '/'
Sie können jetzt auf
PATH_SEPARATOR
Ihren Code zugreifen und ihn plattformabhängig machen.Erkennung zur Laufzeit
Wenn Sie das Betriebssystem zur Laufzeit ermitteln möchten, verwenden Sie die
runtime.GOOS
Variable:if runtime.GOOS == "windows" { fmt.Println("Hello from Windows") }
Während dies in die Laufzeit kompiliert wird und daher die Umgebung ignoriert, können Sie dennoch relativ sicher sein, dass der Wert korrekt ist. Der Grund dafür ist, dass jede Plattform, die es wert ist, unterschieden zu werden, aufgrund unterschiedlicher ausführbarer Formate neu erstellt werden muss und somit einen neuen
GOOS
Wert hat.quelle
// +build !windows
und path_windows.go sollte haben// +build windows
. Ich habe die Antwort oben bearbeitet, um zu zeigen, wohin sie gehen sollen. Sie müssen vor derpackage
Anweisung stehen und von einer Leerzeile gefolgt werden, damit sie nicht als Dokumentation für das Paket interpretiert werden.Haben Sie sich das Laufzeitpaket angesehen? Es hat eine GOOS-Konstante: http://golang.org/pkg/runtime/#pkg-constants
quelle
runtime.GOOS
die gut funktionieren wird, zB: play.golang.org/p/0dDIEoFXfxIch bin gerade auf die Suche nach etwas anderem gestoßen und habe das Alter dieses Beitrags bemerkt, also werde ich eine aktuellere Ergänzung hinzufügen. Wenn Sie nur versuchen, den richtigen Dateipfad zu verarbeiten, würde ich filepath.Join () verwenden . Es nimmt alle Rätselraten aus OS-Problemen. Wenn Sie mehr als nur einen Dateipfad benötigen, können Sie die Laufzeitkonstanten (
runtime.GOOS
&runtime.GOARCH
) verwenden: Beispiel für einen Spielplatzquelle