Comment détecter de manière fiable os / platform dans Go

Voici ce que j’utilise actuellement, ce qui, à mon avis, fait le travail, mais il doit y avoir une meilleure façon de procéder:

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

Comme vous pouvez le voir, dans mon cas, tout ce que je dois savoir, c’est comment détecter les fenêtres, mais j’aimerais savoir comment détecter les plates-formes / os.

Jouer:

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

    Détection au moment de la compilation

    Si vous faites cela pour avoir des implémentations différentes selon le système d’exploitation, il est plus utile d’avoir des fichiers séparés avec l’implémentation de cette fonctionnalité et d’append des balises de construction à chacun des fichiers. Ceci est utilisé à de nombreux endroits dans la bibliothèque standard, par exemple dans le package os .

    Ces “contraintes de construction” ou “balises de construction” sont expliquées ici .

    Disons que vous avez la constante PATH_SEPARATOR et que vous voulez que cette plate-forme dépende, vous feriez deux fichiers, un pour Windows et un pour le (unix) repos:

     /project/path_windows.go /project/path_unix.go 

    Le code de ces fichiers serait alors:

    path_windows.go

     // +build windows package project const PATH_SEPARATOR = '\\' 

    path_unix.go

     // +build !windows package project const PATH_SEPARATOR = '/' 

    Vous pouvez maintenant accéder à PATH_SEPARATOR dans votre code et le faire dépendre de la plate-forme.

    Détection à l’exécution

    Si vous souhaitez déterminer le système d’exploitation à l’exécution, utilisez la variable runtime.GOOS :

     if runtime.GOOS == "windows" { fmt.Println("Hello from Windows") } 

    Bien que cela soit compilé dans le runtime et ignore donc l’environnement, vous pouvez néanmoins être relativement certain que la valeur est correcte. La raison en est que chaque plate-forme qui mérite d’être distinguée doit être reconstruite en raison de différents formats exécutables et a donc une nouvelle valeur GOOS .

    Avez-vous regardé le package d’exécution? Il a un const GOOS: http://golang.org/pkg/runtime/#pkg-constants