En dehors du titre, le générique masculin est utilisé sans aucune discrimination et uniquement dans le but d'alléger le texte.

J’ai passé du temps avec Go pour m’amuser ces derniers mois. Je te propose une introduction au langage préféré de Google. J’ai beaucoup aimé pour plein de raisons et aujourd’hui je t’en parle pendant 5 minutes.

Hey! Ho! Let’s Go!

Oui. Tous les intertitres sont un jeu de mots avec Go dans cet article. C’est pas drôle, mais ça me donne du plaisir.

En 2007 aucun des langages existants étaient assez biens pour les problèmes que rencontraient Google. Trois des employés, Ken Thompson, Rob Pike et Robert Griesemer, se sont réservés une petite salle au calme dans les locaux de Google pour en discuter. Et pour régler les problèmes de Google, ils ont juste décidé de créer un nouveau langage. Et avec leur expérience monstre dans le métier tu t’imagines bien qu’ils ont fait un truc propre. Car oui, ces mecs-là, c’est pas des stagiaires. Ils ont aidé à la création du langage C, Unix ou encore UTF8. On est sur dev experts bien poilus.

Ils voulaient trois choses : une compilation extrêmement rapide, une efficacité d’exécution et un langage très facile à utiliser.

Pour eux, C++ est redoutable côté exécution, mais complexe à utiliser et avec un temps de compilation trop élevé. Java fait mieux coté compilation, mais toujours trop complexe à utiliser. Python est facile à utiliser, mais pas assez rapide. Tous les langages ont un gros défaut pour nos trois légendes. Et c’est dans l’idée de résoudre les trois problèmes en même temps que Go fut imaginé.

Du Go à go-go

En 2009 le langage est publiquement annoncé et en 2012 une première release atterrit sur les Internets. Et la promesse est tenue.

Go est un langage de programmation compilé et fortement typé. Au niveau de la syntaxe, c’est à peu près la même gueule que du C. La compilation permet de tendre vers les meilleures performances possible, mais fait perdre du temps aux développeurs. Pas avec Go. La compilation est presque instantanée. Du coup on a la discipline et la vitesse d’un langage compilé avec la vitesse d’itération d’un langage interprété.

Après compilation Go va générer un seul fichier. Ce fichier contient tout ton code et peut être utilisé tel quel. Ça rend les déploiements beaucoup plus simples. Également Go est un langage multiparadigme. Tu peux faire du procédural et/ou de l’orienté objet. L’orienté objet est bizarre et très limité, on y reviendra.

Go vient également avec un garbage collector ce qui enlève une fois de plus de la complexité pour le développeur. Go rend aussi la gestion de la concurrence plus simple à gérer avec ses Go-routines.

Enfin Go à des features limitées et du coup une façon de faire les choses limitées. Ça peut sembler un inconvénient, mais c’est voulu par les créateurs. Tout le monde travaille de la même façon avec Go puisque les possibilités sont réduites. L’objectif c’est que personne ne soit perdu en tombant sur un code qu’il ne connaît pas. Rob Pike explique ce point mieux que moi dans cette vidéo juste au-dessus.

Du code de derrière les fagots

Pour ta toute première introduction, je vais te montrer du code qu’on trouve dans le tour de go officiel. Je vais le modifier beaucoup pour te montrer plusieurs concepts en même temps et aller plus vite.

package main import "fmt" func main() { fmt.Println("hello world") }

Voici le Hello World. Chaque programme est composé de paquets et l’exécution commence dans le paquet main. D’autres packages Go peuvent être importés en utilisant “import”. Ici on importe fmt qui va nous permettre de printer hello world dans la fonction d’exécution principale main(). Plutôt simple non ?

package main import "fmt" func add(x int, y int) int { return x + y } func main() { var i, j int = 10, 2 fmt.Println(add(i, j)) }

Maintenant, on rajoute une fonction et comme tu peux le voir c’est fortement typé. Les paramètres x et y de la fonction add sont typés en int et le retour de la fonction doit aussi être typé.

Ensuite dans la fonction main on crée deux variables qu’on initialise directement. On affiche ensuite le résultat de la première fonction via fmt. À noter que si je n’avais pas utilisé les variables i et j le compilateur Go m’aurait insulté immédiatement.

Comme je le disais avant, l’orienté objet est bizarre avec Go. Il n’y a pas de classe, mais des méthodes sur des types. Les interfaces sont implémentées implicitement. Il n’y a pas de mot clef implement, c’est franchement déroutant, regardons ça de plus près.

package main import "fmt" // on déclare une interface type Developer interface { Code() string } // on déclare un type struct type GoDeveloper struct { } // le seul fait d'utiliser la fonction Code() ici implémente l'inferface Developer dans notre struct func (g GoDeveloper ) Code() string { return "Go code" } func main() { var goDeveloper Developer = &GoDeveloper{} fmt.Println(goDeveloper.Code()) }

Enfin, regardons un peu à quoi ressemble une Go-routine.

package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { // lancé ici avec le mot clef go go say("world") say("hello") }

Même si le concept existe dans d’autres langages, les Go-routine sont une des features phares de Go. Ce sont des fonctions qui peuvent être lancées en concurrence avec d’autres fonctions. Ça s’apparente à des threads mais qui sont extrêmement peu gourmands ! Les Go-routines communiquent entre elles en utilisant les channels. Si tu veux voir plus de code pour te faire un meilleur avis ce site est juste parfait.

Utilisé à tire-larigot

Les gens utilisent souvent le nom Golang pour parler de Go. Ce nom vient tout simplement du site web officiel golang.com. Le domaine go.com est déjà pris par un site de Disney. Google n’a pas eu le choix et maintenant le nom Golang est partout. À noter que Google supporte Golang mais que le langage reste open source.

En tout cas ça n’a pas empêché toute la terre d’utiliser Golang. Évidemment, tu as Google qui l’utilise partout. Docker est complètement écrit en Golang. C’est utilisé en prod chez Amazon, IBM, Netflix, Facebook et même DigitalOcean. Et ça fait maintenant plus de 10 ans que ça existe donc l’écosystème a eu le temps de se développer.

Du coup j’y go ?

Coté adaption par les développeurs Go continu sa lente montée depuis 10 ans atteignant le top 10 de popularité sur GitHub. Il n’est cependant pas tant utilisé que ça en entreprise. Il atteint seulement la 13e position dans le dernier sondage StackOverFlow. Ceci dit il est dans le top 3 des langages les plus voulus par les développeurs.

Personnellement j’adore Go. J’ai rencontré aucun des problèmes du langage qui sont pourtant bien présents. Je continue à faire mumuse avec, mais je me vois mal complètement passer le cap de plus rien écrire en NodeJS à la maison. J’aime trop NodeJS pour faire ça. Par contre mon plan dans le futur est de faire des modules WebAssembly en Go et de les appeler via import quand ça sera mergé stable partout ! Trop hâte !

Est-ce que tu devrais tout lâcher et faire du Go car c’est le futur ? Non. Aucun langage n’est le futur. Le futur sera toujours composé de beaucoup de langages. Mais si t’as envie de tester un outil hyper simple et hyper performant pour ton backend : c’est vraiment intéressant. Je te conseille fortement de faire au moins le tour interactif officiel pour te faire ton propre avis.

Épilogue

Ils sont en train d’incrémenter la version 1 de Golang (aujourd’hui en 1.13) au compte-goutte avec de nouvelles features. Dans le blog officiel il parle de passer en version 2 au alentour de la version 1.20. J’ai hâte de voir ce que sera devenu le langage et son adoption à ce moment-là.