Maison  >  Article  >  développement back-end  >  Golang prend-il en charge le multiplateforme ?

Golang prend-il en charge le multiplateforme ?

青灯夜游
青灯夜游original
2023-01-12 17:14:563849parcourir

golang prend en charge multiplateforme. En raison de sa conception modulaire et de sa modularité, c'est-à-dire que le code est compilé et converti sous la forme binaire la plus petite possible, Golang ne nécessite aucune dépendance ; son code peut être compilé sur n'importe quelle plate-forme et peut être utilisé sur n'importe quel serveur et application. De plus, le langage Go possède son propre éditeur de liens et ne s'appuie sur le compilateur et l'éditeur de liens fournis par aucun système. Par conséquent, le fichier exécutable binaire compilé peut s'exécuter dans presque tous les environnements système ;

Golang prend-il en charge le multiplateforme ?

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

golang prend en charge multiplateforme.

L'une des fonctionnalités de golang est : l'indépendance de la plateforme (compilation multiplateforme).

Le langage Go est comme le langage Java et prend en charge l'indépendance de la plate-forme. En raison de sa conception modulaire et de sa modularité, c'est-à-dire que le code est compilé et converti sous la forme binaire la plus petite possible, il ne nécessite donc aucune dépendance. Son code se compile sur n'importe quelle plateforme et sur n'importe quel serveur et application.

Pas besoin d'utiliser une machine virtuelle, le code du langage Go peut être directement généré sous forme de fichier exécutable binaire. De plus, le langage Go possède son propre éditeur de liens et ne s'appuie sur le compilateur et l'éditeur de liens fournis par aucun système. Par conséquent, le fichier exécutable binaire compilé peut s’exécuter dans presque tous les environnements système.

Golang, comme C/C++, est compilé dans des fichiers binaires liés à la plate-forme, donc lors du développement avec golang, vous devez également considérer la question de la prise en charge multiplateforme. Cet article résume brièvement comment Golang résout les problèmes multiplateformes.

GOOS et GOARCH

Tout d'abord, vous devez comprendre les deux variables d'exécution définies par golang dans le package d'exécution :

  • runtime.GOOSruntime.GOOS

  • runtime.GOARCH

runtime.GOARCH

GOOS est le système d'exploitation de la machine cible sur laquelle le programme golang s'exécute, et GOARC est l'architecture de la machine cible sur laquelle le programme golang s'exécute. Leurs valeurs sont déterminées lors de la compilation du programme. Les définitions de ces deux variables d'exécution (en fait des constantes, voir ci-dessous) sont les suivantes :


// GOOS is the running program's operating system target:
// one of darwin, freebsd, linux, and so on.
const GOOS string = sys.GOOS

// GOARCH is the running program's architecture target:
// one of 386, amd64, arm, s390x, and so on.
const GOARCH string = sys.GOARCH

Vous pouvez obtenir dynamiquement ces deux valeurs​​au moment de l'exécution grâce au programme suivant,

package main
import (
"fmt"
"runtime"
)

func main() {
fmt.Printf("OS: %s, ARCH: %s\n", runtime.GOOS, runtime.GOARCH)
}

Problème de compilation croisée

La compilation des programmes Golang est très simple, sans considérer aucune option de compilation, utilisez simplement go build Par exemple, la commande suivante générera un fichier binaire nommé "helloworld" dans le répertoire courant :

go build helloworld.go

Mais le problème est que si le système d'exploitation de la machine de compilation actuelle est Linux et ARCH est amd64, alors le binaire compilé ne peut pas fonctionner sur Mac OS. Vous pouvez le recompiler une fois sur Mac OS pour produire un fichier binaire pour Mac OS. Mais dans ce cas, il faut préparer un environnement de compilation pour toutes les plateformes cibles, ce qui n’est évidemment pas une méthode efficace.

En fait, résoudre ce problème est très simple, il suffit d'utiliser les deux variables d'exécution mentionnées ci-dessus. Par exemple, si vous disposez uniquement d'un environnement de compilation Linux, mais que vous souhaitez générer un fichier binaire pouvant s'exécuter sous Mac OS, il vous suffit de définir deux variables d'environnement. Si le système d'exploitation cible est Darwin et ARCH est amd64, utilisez la commande suivante pour compiler :

$ GOOS=darwin GOARCH=amd64 go build helloworld.go

Comment faire en sorte que votre package prenne en charge plusieurs plates-formes ?

Rejoignez-vous et développez un package en Golang que d'autres personnes pourront utiliser , puis Comment faites-vous pour que votre package prenne en charge plusieurs plates-formes ? En fait, les développeurs n'ont généralement pas besoin de prendre en compte ce problème lors du développement d'applications générales, car la bibliothèque standard de Golang protège les détails sous-jacents.

Si vous souhaitez publier une version binaire, il vous suffit de publier une version prenant en charge plusieurs plates-formes via la compilation croisée ci-dessus.

Si le programme Golang que vous développez utilise des appels système de niveau relativement bas (bien sûr, cela n'est généralement pas recommandé) et que les appels système des différentes plates-formes sont différents, vous devez alors considérer la question de la prise en charge de plusieurs plates-formes. Vous pouvez déterminer dynamiquement les valeurs de runtime.GOOS et runtime.GOARCH dans le programme, puis les gérer via des instructions if-else if ou switch case, mais ce n'est pas une méthode souhaitable car elle n'est pas propice à la maintenance et rend ; le code a l'air moche.

L'approche recommandée consiste à placer les implémentations des différentes plates-formes dans différents fichiers, puis à indiquer au compilateur Golang à quelle plate-forme correspond chaque fichier. Il existe deux méthodes ici. La première méthode consiste à l'indiquer par le nom de fichier. Le modèle de nom de fichier est le suivant :

*_[GOOS]_[GOARCH].go

GOOS et GOARCH sont facultatifs dans le nom de fichier ci-dessus. Par exemple, en supposant que vous ayez des implémentations différentes pour les plateformes Mac OS, Linux et Windows, vous pouvez nommer ces trois fichiers comme suit : 🎜
yourfile_darwin.go
yourfile_linux.go
yourfile_windows.go
🎜 Ensuite, lorsque votre plateforme cible est Linux, seul votrefichier_linux.go sera compilé. S'il n'y a ni GOOS ni GOARCH dans le nom du fichier (par exemple, votrefichier.go), alors la valeur par défaut est toujours compilée. 🎜

另外一种办法是通过一个特殊的注释。例如,假设你想使yourfile.go只在linux平台时才会编译,那么在文件头加上"+build linux"即可:

// +build linux

......

这里一定要注意,"+build linux"必须在所有代码的前面,但这条注释之前可以有空行或其它注释。它之后必须有一个空行。

这种通过注释的方式和通过文件名标示的方式作用相同,但是文件名的方式只能支持一个平台,而注释的方式可以标示一个文件同时支持多个平台,例如下面的注释标示该文件同时支持freebsd, openbsd和netbsd这三个平台:

// +build freebsd openbsd netbsd

注意多个平台之间用空格隔开时表示"或"的关系,如果用逗号隔开则表示"与"的关系,例如下面的注释表示 (linux AND 386) OR darwin:

// +build linux,386 darwin

这里只是介绍了最基本的使用场景,实际使用中,应该充分发挥软件设计的各种思想灵活使用。例如虽然针对不同的平台有不同的实现,但给上层客户端应用程序提供API应该统一。

【相关推荐:Go视频教程编程教学

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Y a-t-il des cours en golang ?Article suivant:Y a-t-il des cours en golang ?