La chronique suivante du Tutoriel Golang vous présentera les avantages et les inconvénients de la programmation en langage Go. J'espère qu'elle sera utile aux amis dans le besoin !
Récemment, nous avons écrit une API utilisant Go, un langage de programmation open source lancé par Google en 2009. Au cours du processus d'utilisation de Go pour le développement, nous avons acquis beaucoup d'expérience et d'informations, et nous souhaitons les partager avec les lecteurs, c'est pourquoi cet article a été rédigé.
Lors du choix d'un langage de programmation pour un projet, nous recommandons toujours de comprendre ce que le projet va construire avant de réfléchir au langage de programmation à utiliser pour le construire. Laissez le produit être le facteur décisif dans la manière dont il doit être construit.
Voici quelques-uns des avantages et des inconvénients que nous avons trouvés lors du développement dans Go, qui peuvent vous aider à comprendre si Go est le bon langage pour construire votre prochain projet.
L'utilisation du langage Go a explosé ces dernières années. Il semble que chaque startup l'utilise pour les systèmes backend. Les développeurs pensent qu’il existe de nombreuses raisons pour lesquelles il est si populaire.
Le langage Go est très rapide
Le langage Go est un langage de programmation très rapide. Étant donné que le langage Go est compilé en code machine, il fonctionnera naturellement mieux que les langages de programmation interprétés ou dotés d'exécutions virtuelles. Les programmes Go se compilent également très rapidement et les binaires résultants sont très petits. Notre API se compile en quelques secondes seulement et l'exécutable résultant ne fait que 11,5 Mo.
Facile à maîtriser
Par rapport à d'autres langages, la syntaxe du langage Go est très simple et facile à maîtriser. Vous pouvez conserver la majeure partie de la syntaxe de Go dans votre tête, ce qui signifie que vous n'avez pas besoin de passer beaucoup de temps à rechercher des choses. Le langage Go est également très propre et facile à lire. Les programmeurs non-Go, en particulier ceux habitués à la syntaxe de style C, peuvent lire le code Go et comprendre ce qui se passe.
Langage de définition de type statique
Le langage Go est un puissant langage de définition de type statique. Il existe des types de base tels que int, byte et string. Il existe également des types structurels. Comme pour tout langage fortement typé, le système de types permet au compilateur de détecter les erreurs entre les classes. Le langage Go possède également des types de listes et de cartes intégrés, et ils sont également faciles à utiliser.
Type d'interface
Le langage Go a un type d'interface, et toute structure peut satisfaire l'interface simplement en implémentant la méthode d'interface. Cela vous permet de découpler les dépendances dans votre code. Vous pouvez ensuite vous moquer de vos dépendances dans vos tests. En utilisant des interfaces, vous pouvez écrire du code plus modulaire et testable. Le langage Go possède également des fonctions de premier ordre, qui permettent aux développeurs d'écrire du code de manière plus pratique.
Bibliothèque standard
Le langage Go possède une assez bonne bibliothèque standard. Il fournit des fonctions intégrées pratiques pour travailler avec des types de base. Il existe des packages qui vous permettent de créer facilement un serveur Web, de gérer les E/S, d'utiliser des techniques de chiffrement et de manipuler les octets bruts. La sérialisation et la désérialisation JSON fournies par la bibliothèque standard sont très simples. En utilisant des "tags", vous pouvez spécifier des noms de champs JSON à côté des champs de structure.
Prise en charge des tests
La prise en charge des tests est intégrée à la bibliothèque standard et ne nécessite aucune dépendance supplémentaire. Si vous avez un fichier appelé thing.go, écrivez vos tests dans un autre fichier appelé thing_test.go et exécutez "go test". Go exécutera rapidement ces tests.
Outils d'analyse statique
Le langage Go dispose de nombreux et puissants outils d'analyse statique. Un outil en particulier est gofmt, qui formate le code selon le style suggéré par Go. Cela normalise de nombreuses opinions sur le projet et permet aux chefs d'équipe de se concentrer sur le travail effectué par le code. Nous exécutons gofmt, golint et vet sur chaque build, et si des avertissements sont détectés, la build échouera.
Garbage Collection
Lorsque le langage Go a été conçu, la gestion de la mémoire a été intentionnellement conçue pour être plus simple que le C et le C++. Les objets alloués dynamiquement sont récupérés. Le langage Go rend l'utilisation des pointeurs plus sûre car il ne permet pas l'arithmétique des pointeurs. La possibilité d’utiliser des types valeur est également fournie.
Un modèle de concurrence plus simple
Bien que la programmation simultanée n'ait jamais été facile, Go la rend plus facile que d'autres langages. C'est presque aussi simple que de créer un thread léger appelé « goroutine » et de communiquer avec lui via un « canal ». Des modèles plus complexes sont également possibles.
Comme nous en avons discuté plus tôt, Go est en effet un excellent langage. Il a une syntaxe claire et est rapide à exécuter. Il présente également de nombreux avantages. Cependant, un langage de programmation ne se résume pas uniquement à sa syntaxe. Voici quelques-uns des problèmes que nous avons rencontrés.
Pas de génériques
Tout d'abord, ce problème est comme l'éléphant dans la pièce, c'est un fait évident mais ignoré. Le langage Go n'a pas de génériques. Pour les développeurs issus d’un langage comme Java, passer à Go est un énorme obstacle à surmonter. Cela signifie que le niveau de réutilisation du code est réduit. Bien que le langage Go possède des fonctions de première classe, si vous écrivez des fonctions telles que « map », « reduce » et « filter » et concevez ces fonctions pour qu'elles fonctionnent sur des collections d'un type, vous ne pouvez pas réutiliser ces fonctions sur des collections de types différents. . Il existe de nombreuses façons de résoudre ce problème, mais elles impliquent toutes en fin de compte d'écrire davantage de code, ce qui réduit la productivité et la maintenabilité.
Les interfaces sont implicites
Bien qu'il soit agréable d'avoir des interfaces, les structures implémentent des interfaces implicitement plutôt qu'explicitement. C'est considéré comme l'un des points forts du langage Go, mais nous avons eu du mal à déterminer à partir de la structure s'il implémente l'interface. Vous ne pouvez vraiment le savoir qu’en essayant de compiler le programme. Ce n'est certainement pas un problème si le programme est petit. Mais si le programme est de moyenne à grande échelle, les problèmes seront grands.
Mauvaise prise en charge des bibliothèques
La prise en charge des bibliothèques de Go est inégale. Notre API s'intègre à Contentful, qui ne dispose pas de SDK Go officiellement pris en charge. Cela signifie que nous devons écrire (et maintenir !) beaucoup de code pour demander et analyser les données de Contentful. Nous devons également nous appuyer sur des bibliothèques Elasticsearch tierces. Les SDK Go fournis par les fournisseurs ne sont pas aussi populaires que leurs homologues Java, Ruby ou JavaScript.
La communication avec la communauté est difficile
La communauté Go peut ne pas accepter les suggestions. Considérez ce problème dans le référentiel GitHub de golint : https://github.com/golang/lint/issues/65, un utilisateur a demandé que golint puisse faire échouer la construction lorsqu'un avertissement est trouvé (c'est ce que nous faisons dans le cadre du projet ). Les responsables ont immédiatement rejeté l'idée. Cependant, tant de personnes ont commenté le problème que les responsables ont fini par ajouter la fonctionnalité demandée un an plus tard.
La communauté Go semble également détester les frameworks Web. Bien que la bibliothèque HTTP de Go couvre beaucoup de terrain, elle ne prend pas en charge les paramètres de chemin, la vérification et la validation des entrées, ni les problèmes transversaux courants dans les applications Web. Les développeurs Ruby ont Rails, les développeurs Java ont Spring MVC et les développeurs Python ont Django. Mais de nombreux développeurs Go choisissent d’éviter d’utiliser des frameworks. Cependant, la réalité est qu’il n’existe pas de cadres, bien au contraire, ils sont nombreux. Mais une fois que vous commencez à utiliser un framework pour un projet, il est presque impossible d’éviter l’abandon.
Gestion des dépendances fractionnées
Pendant longtemps, le langage Go n'avait pas de gestionnaire de paquets stable et formel. Le projet Go n'a publié que récemment Godep après des années de mendicité communautaire. De nombreux outils ont déjà comblé cette lacune. Nous utilisons Govendor, qui est très puissant, pour nos projets, mais cela signifie que la communauté est fragmentée et peut être très déroutante pour les développeurs qui découvrent le langage Go. De plus, presque tous les gestionnaires de packages sont alimentés par des référentiels Git et l'historique des référentiels Git peut changer à tout moment. Comparez cela à Maven Central, qui ne supprime ni ne modifie jamais les bibliothèques dont dépend votre projet.
Décider d'utiliser ou non Go
Parfois, vous devez tenir compte de la situation de la machine. Lorsque vous envoyez et recevez des octets. Lorsque vous gérez des milliers de processus simultanés. Vous pourriez également écrire un système d’exploitation, un système de conteneurs ou un nœud blockchain. Dans ces cas-là, vous ne vous soucierez probablement pas des génériques. Parce que vous êtes occupé à extraire chaque nanoseconde de performances de la puce.
Mais, bien souvent, il faut penser aux humains. Données du domaine métier que vous devez traiter : clients, employés, produits, commandes. Vous devez écrire une logique métier qui fonctionne sur ces entités de domaine et vous devez maintenir cette logique métier au fil des années. Et vous devez faire face à des besoins changeants, et vous devez le faire le plus rapidement possible. Dans ces cas, l’expérience du développeur est importante.
Go est un langage de programmation qui valorise le temps machine par rapport au temps humain. Parfois, les performances de la machine ou du programme sont les plus critiques dans votre domaine. Dans ces cas-là, Go peut être une bonne alternative au C ou au C++. Cependant, lorsque vous écrivez une application n-tier typique, des goulots d'étranglement en termes de performances surviennent souvent au niveau de la base de données et, plus important encore, dans la manière dont vous modélisez les données.
Lorsque vous décidez d'utiliser Go, tenez compte des règles empiriques suivantes :
Si vous avez affaire à des octets, le langage Go peut être un bon choix.
Si vous traitez des données, le langage Go n'est peut-être pas un bon choix.
Cette situation pourrait changer un jour dans le futur. La langue et la communauté Go sont encore très jeunes. Ils pourraient nous surprendre et ajouter des génériques ; ou un framework Web populaire pourrait prendre le relais. Pour l'instant, cependant, nous nous en tiendrons aux langages de programmation matures qui bénéficient d'un support universel, d'une gestion des dépendances mature et nous concentrerons sur la modélisation du domaine métier.
Pour plus d'articles techniques sur Go, veuillez visiter la colonne Tutoriel sur le langage 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!