Tutoriel Go: Premiers pas avec Google Go

Pourquoi voudriez-vous utiliser la langue Go? Fondamentalement, il s'agit d'un langage compilé concis, simple, sûr et rapide avec de merveilleuses fonctionnalités de concurrence et il gère facilement les grands projets. Il est également open source gratuit, même s'il a été développé à l'origine chez Google.

Selon Rob Pike, l'un des concepteurs du langage, «les objectifs du projet Go étaient d'éliminer la lenteur et la maladresse du développement logiciel chez Google, et ainsi de rendre le processus plus productif et évolutif. Le langage a été conçu par et pour des personnes qui écrivent - et lisent, déboguent et maintiennent - de grands systèmes logiciels. »

Conformément à ces objectifs, Go manque de nombreuses fonctionnalités de certaines autres langues importantes - et c'est en fait une force. Go n'est pas orienté objet, il n'a pas de fichiers d'en-tête ou de déclarations avant, il n'a pas de hiérarchie de types, il n'a pas de surcharge de méthode ou d'opérateur, il n'a pas de génériques, il n'a pas de machine virtuelle pour un runtime, il n'a pas d'exceptions et il n'a pas d'assertions.

D'un autre côté, ce que Go a fonctionne assez bien. Il peut compiler de gros programmes en quelques secondes. Il a des coroutines à faible coût (appelées goroutines ) qui peuvent communiquer efficacement via des canaux . Il a des interfaces et une composition d'interface. En outre, Go prend en charge des fonctions de première classe, des fonctions d'ordre supérieur, des types de fonction définis par l'utilisateur, des littéraux de fonction, des fermetures et des valeurs de retour multiples. En d'autres termes, il prend en charge un style de programmation fonctionnel dans un langage fortement typé.

Si vous mourez d'envie de demander l'une des fonctionnalités manquantes que j'ai mentionnées ci-dessus, vous voudrez peut-être lire la discussion sur les changements de langue dans la FAQ sur la langue Go: La réponse est généralement "Non, parce que ..." En général, les meilleurs programmes Go sont conçu à partir de zéro pour utiliser les fonctionnalités du langage Go, plutôt que traduit littéralement à partir d'autres langues utilisant des abstractions différentes.

Installez Go

Les brèves instructions d'installation de Go apparaissent dans le référentiel source. Vous pouvez télécharger les versions binaires de Go pour Windows, MacOS et Linux ou installer Go à partir des sources. Vous trouverez des instructions pour installer Go à partir des sources sur GitHub.

Si vous avez déjà installé Go, vous devez vérifier la version actuelle de la version au bas de //golang.org/, puis vérifier votre version installée à partir de la ligne de commande:

$ go version

Si votre installation est obsolète, téléchargez et installez la version actuelle. Redémarrez toutes les invites de commande ouvertes (Windows) ou les terminaux. Réexécutez go versionet assurez-vous que la version est celle que vous attendiez; sinon, il se peut qu'une ancienne version de Go soit installée ailleurs qui doit être supprimée.

(Non, je ne suis pas paranoïaque. J'ai réussi à me mettre dans la situation que j'ai décrite en utilisant Homebrew pour installer une version et le package MacOS standard pour installer la prochaine version un mois environ plus tard. Ils s'installent à différents endroits sur le $PATH. Une fois que j'ai compris ce qui s'était passé, j'ai pu désinstaller l'ancienne version avec Homebrew.)

Une autre option d'installation, si vous souhaitez une assistance et une indemnisation et que vous êtes en mesure de payer, consiste à utiliser ActiveGo.

Une fois que vous avez installé le compilateur et les outils Go, vous devez effectuer l'exercice de compilation et d'exécution d'un programme Go, comme décrit dans la section «Tester votre installation» de la page d'installation.

Configurez votre environnement Go

Allez programmeurs conservent généralement tout leur code dans un espace de travail, avec bin, pkget des srcdossiers. Dans chaque dossier, les projets ont généralement des chemins liés aux référentiels Git, tels que GitHub ou GitLab. Par exemple, je garde tout mon code de langue Go sous ~/worket définit ma GOPATHvariable d'environnement sur $HOME/work. Le chemin d'accès à mon dossier de code source «hello.go» est $GOPATH/src/github.com/meheller/hello.

J'ajoute également le GOPATH/binrépertoire à mon chemin, pour faciliter l'exécution des programmes Go à partir de n'importe quel répertoire:

export GOPATH = $ HOME / travail

export PATH = $ PATH: $ (go env GOPATH) / bin

Les utilitaires de langage Go s'installent GOPATHpar défaut, donc le fait de placer le GOPATH/binrépertoire sur le chemin facilite également la tâche pour vous et les éditeurs et IDE compatibles Go. Vous pouvez installer la plupart des utilitaires avec $go get une fois que vous savez ceux dont vous avez besoin et leurs chemins de référentiel. Les référentiels sont généralement faciles à trouver avec une recherche Google. Dans certains cas, un plug-in d'édition pour Go installera les utilitaires (par exemple gocode) automatiquement.

Si vous ne le définissez pas vous-même, la valeur par GOPATHdéfaut est $HOME/gosous Unix et MacOS et %USERPROFILE%/gosous Windows.

Outils linguistiques Go, éditeurs et IDE

Plusieurs utilitaires Go sont installés dans le cadre du package avec le compilateur. D'autres peuvent être installés avec la go getcommande. Les utilitaires de ligne de commande Go les plus utilisés sont répertoriés ci-dessous.

 
Nom Synopsis
go Gère le code source de Go et exécute les autres commandes répertoriées ici.
cgo Permet la création de packages Go qui appellent du code C.
cover Un programme pour créer et analyser les profils de couverture générés par go test -coverprofile.
fix Recherche les programmes Go qui utilisent d'anciennes fonctionnalités du langage et des bibliothèques et les réécrit pour en utiliser les plus récentes.
fmt Formats des packages Go. Également disponible en tant que gofmtcommande indépendante avec des options plus générales.
godoc Extrait et génère de la documentation pour les packages Go.
vet Examine le code source de Go et signale les constructions suspectes, telles que les Printfappels dont les arguments ne correspondent pas à la chaîne de format.

La manière habituelle d'appeler la plupart de ces commandes est go, par exemple, sous forme de sous-commandes de go fmt. D'autres doivent être appelés via la go toolsous - commande. Sur mon installation, go toolrenvoie la liste suivante des outils connus:

Outil $ go

addr2line

asm

buildid

cgo

compiler

couverture

dist

doc

réparer

lien

nm

objdump

pack

pprof

test2json

tour

trace

vétérinaire

Ces outils sont documentés dans la liste complète des commandes Go. À propos, assurez-vous que votre GOPATHest défini avant d'ajouter des outils Go ou des plug-ins d'édition Go utilisant les outils Go.

Le référentiel Go n'a pas d'éditeur ou de support IDE depuis la version 1.4, mais il y en a beaucoup qui connaissent Go, soit prêt à l'emploi, soit avec des modules complémentaires. J'en ai discuté beaucoup dans un article de 2017; il y a aussi une liste non officielle maintenue par la communauté Golang.

Mes IDE de langue Go préférés sont GoLand (illustré ci-dessus; renommé de Gogland depuis que j'ai écrit l'article en 2017) et Komodo. Les deux sont des produits payants avec des essais gratuits.

Vous voudrez installer le débogage Delve for Go. Sur MacOS, vous devrez peut-être également ajouter les utilitaires de ligne de commande à Xcode, et éventuellement ajouter un lien logiciel vers debugserver, comme décrit dans le commentaire du 5 juin dans la liste des problèmes de Delve. L'exécution xcode-select --installrésoudra également les problèmes de recherche debugserver, bien que de manière brutale.

Mes éditeurs Go-aware préférés avec des interfaces graphiques sont Atom et Visual Studio Code; les deux sont gratuits. Si vous choisissez Atom, pensez à ajouter les packages go-plus et go-debug; si vous choisissez Visual Studio Code, envisagez d'ajouter vscode-go.

Si vous êtes un utilisateur inconditionnel de Vim ou d'Emacs, alors restez avec ce que vous savez - pas que je pourrais même arracher votre éditeur de vos mains froides et mortes. Vim-go ajoute la prise en charge de la langue Go pour Vim, et go-mode ajoute la prise en charge de la langue Go pour Emacs.

Un tour de Go

Vous pouvez en apprendre un peu plus en parcourant «A Tour of Go», en ligne ou hors ligne. En supposant que vous avez terminé l'installation locale du compilateur et des outils Go, vous pouvez installer la visite guidée pour qu'elle s'exécute localement en exécutant ces deux commandes:

$ aller chercher golang.org/x/tour/gotour

$ gotour

La deuxième ligne devrait démarrer un serveur Web et ouvrir une fenêtre de navigateur. Cela ressemblera exactement à la visite en ligne, mais pourrait s'exécuter un peu plus rapidement car il crée et exécute les exemples de code sur votre propre machine. Appuyez sur Ctrl-C dans la fenêtre de commande pour arrêter le serveur lorsque vous avez terminé.

La visite est divisée en trois sections. Je veux que vous parcouriez toute la visite, y compris les quiz, mais je résumerai chaque section ci-dessous comme un aperçu et vous poserai quelques questions. Je donne les réponses à mes questions à la fin de l'article (pas de coup d'oeil!). 

Aller aux bases du langage

Go Basics Leçon 1

Question 1. Dans cet exemple, il existe trois packages. Quels sont-ils et comment sont-ils utilisés? Pourquoi le programme renvoie-t-il toujours le même numéro même s'il existe une randfonction?

Notez que je n'ai pas appelé la leçon 2. Ne sautez pas les leçons simplement parce que je ne les ai pas commentées.

Go Basics Leçon 3

Si vous exécutez cet exemple, vous verrez des messages d'erreur:

prog.go: 9: 14: ne peut pas faire référence au nom non exporté math.pi

prog.go: 9: 14: non défini: math.pi

Question 2. Pourquoi les erreurs? Comment pouvez-vous réparer le programme?

Go Basics Leçon 4

Question 3. Comparez cette déclaration à l'équivalent en C. Qu'est-ce qui est différent?

Go Basics Leçon 8

Question 4. Pourquoi ce programme ne génère-t-il aucune erreur?

Go Basics Leçon 10

Question 5. Quel est le type de k? Pourquoi? Si le type n'est pas évident, consultez la leçon 11 pour savoir comment l'afficher.

Go Basics Leçon 12

Cette leçon répond à la question que j'ai posée dans la leçon 8.

Aller à la leçon de contrôle de flux 1

Question 6. En quoi est-ce différent de la forboucle dans votre langue préférée? Pensez-vous que les autres constructions en boucle dans votre langue préférée sont nécessaires? Les informations supplémentaires des trois prochaines leçons vous font-elles changer d'avis?

Go Flow Control Leçon 7

Avant d'exécuter ce programme, vérifiez-le et notez ce que vous pensez qu'il imprimera. Exécutez le programme. Avez-vous raison? Sinon, qu'est-ce que vous n'avez pas compris?

Aller à la leçon de contrôle de flux 8

C'est le genre d'exercice que vous pourriez faire au début d'un entretien sur tableau blanc. Chronométrez-vous pendant que vous travaillez. Dites ce que vous pensez pendant que vous travaillez sur le problème.

Question 7. Le reste de la section sur le contrôle de flux est important à comprendre. Après avoir parcouru les leçons 9 à 13, expliquez les instructions Go switchet deferd'une manière qu'un programmeur C, Java ou JavaScript pourrait faire.

Aller plus de types Leçon 1

Avant d'exécuter ce programme, vérifiez-le et notez ce que vous pensez qu'il imprimera. Exécutez le programme. Avez-vous raison? Sinon, qu'est-ce que vous n'avez pas compris?

Que pensez-vous du fait que Go ait des pointeurs mais pas de l'arithmétique des pointeurs?

Parcourez la section Plus de types jusqu'à ce que vous arriviez à l'exercice de la leçon 18. Question 8. Qu'avez-vous appris sur les tableaux et les tranches Go? Terminez maintenant l'exercice.

Poursuivez l'exercice de la leçon 23.

Question 9. Expliquez un Go map. Pourquoi voudriez-vous en utiliser un?

Terminez la section Plus de types.

Question 10. Go peut-il être utilisé comme langage de programmation fonctionnel, même s'il est compilé? Quand et pourquoi utiliseriez-vous des fermetures?

Méthodes et interfaces Go

Parcourez les 25 leçons de cette section en commençant par //tour.golang.org/methods/1.

Question 11. Lorsque vous avez terminé, expliquez en quoi l'utilisation des méthodes et des interfaces par Go est différente de celle des classes C ++. Lequel préfères-tu? Pourquoi?

Aller simultanéité

La goroutine est l'une des caractéristiques déterminantes de Go pour la concurrence. Dans la première leçon de la section sur la concurrence, essayez de vérifier le programme (ci-dessous) et notez ce que vous pensez qu'il imprimera.

Exécutez le programme. Avez-vous raison? Expliquez ce qui se passe réellement et pourquoi.

Les canaux sont le moyen de synchroniser implicitement les goroutines. Dans la leçon suivante (ci-dessous), essayez à nouveau de vérifier le programme avant de l'exécuter.

Question 12. Pourquoi n'y a-t-il qu'un seul canal dans cet exemple, même s'il y a deux appels de goroutine?

L'instruction select permet à un goroutine d'attendre plusieurs opérations de communication. Quel est l'ordre dans lequel les instructions s'exécutent dans le programme ci-dessous?

L'exercice sur les arbres binaires équivalents est un autre que vous pourriez rencontrer dans une interview sur tableau blanc. Chronométrez-vous et expliquez votre réflexion lorsque vous mettez en œuvre une solution De même, faites l'exercice sur la mise en œuvre d'un robot d'exploration Web comme si vous étiez dans une interview.

Réponses aux questions Go

Réponse 1. Les packages sont désignés par la packagedéclaration du programme en cours et par la importdéclaration des packages externes utilisés. Dans ce programme simple, mainest le propre package du programme, et il est importé fmtafin qu'il puisse imprimer, et math/ randafin qu'il puisse générer un nombre aléatoire.

Les différentes méthodes randutilisent l'heure de l'horloge pour générer des nombres aléatoires, mais l'heure est fixée dans l' gotourenvironnement. Comme exercice de suivi, trouvez le package et la méthode qui rapporte l'heure (indice: regardez ici si vous êtes bloqué), et utilisez-le pour imprimer l'heure actuelle. Exécutez-le plusieurs fois dans l' gotourenvironnement, créez également le programme localement et exécutez-le plusieurs fois sur votre propre ordinateur.

Réponse 2. Les exportations en Go doivent toujours être en majuscules et la langue est sensible à la casse. math.Piest la bonne méthode.

Réponse 3. En C / C ++, les déclarations de variables suivent la forme (par exemple int i, j, k;), tandis que dans Go, le type suit le nom de la variable et peut être omis tant que le type peut être déduit. En C / C ++, le type de retour précède un nom de fonction, alors qu'en Go, il vient après la liste des paramètres de la fonction et avant le corps de la fonction. En C / C ++, les points-virgules de fin sont obligatoires.

Réponse 4. Cela ne génère pas d'erreurs car les variables Go qui ne sont pas définies autrement sont initialisées à la valeur zéro du type, par exemple 0ou false. En C / C ++, le compilateur marque les variables non initialisées.

La réponse 5.k est un entier, car il a été initialisé avec 3.