Comprendre Go en 5 minutes

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

Comprendre Go en 5 minutes

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.



Go


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é.



Go


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.



compiler


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.



Go


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 !



webassembly


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à.

Qui me parle ?

jesuisundev
Je suis un dev. En ce moment je suis Backend Développeur / DevOps à Montréal. Le dev est l'une de mes passions et j'écris comme je parle. Je continue à te parler quotidiennement sur mon Twitter. Tu peux m'insulter à cet e-mail ou le faire directement dans les commentaires juste en dessous. Y'a même une newsletter !

Commentaire(s)

  1. T’expliques bien, c’est abordable et super agréable.
    Je sais pas si je vais tester Go mais en tout cas maintenant je connais les concepts clés.
    Merci !

  2. Merci pour l’article, j’ai bien apprécié. Le go me démange les doigts. Pour l’instant, je fais mumuse avec Hugo, le fameux SSG.

    Sinon, deux coquilles : “s/Go continus sa lente monté/Go continue sa lente montée/”

  3. Merci pour l’article, toujours très sympa sur le fond comme la forme!
    J’ai jamais touché a Go mais un ami me l’avait bien vendu en appuyant sur le fait que l’écosystème avait un package manager type NPM bien pratique/fourni, un vrai avantage comparé a c++ par exemple..

  4. Belle article, merci.

    Le peu que j’ai essayé Go, ne m’a pas vraiment emballé. Je trouve justement le fait qu’il soit “simple”, n’est pas un avantage car il manque plein de truc utiles qu’on trouve ailleurs (les filtres sur une liste, la manipulation de string, ….) et du coup je le trouve un peu pauvre (peut-être je ne l’ai pas essayé assez longtemps).
    Autre point qui me gêne, d’est qu’on dit qu’il soit simple alors qu’il y a quelque tricks qui ne me paraisse pas des plus simplistes genre les tableaux et slices, les underscore ou les variadic

    Je ne dis pas qu’il n’est pas bien, juste que je n’ai pas encore trouvé un avantage par rapport à ce qui existe déjà.

  5. Nice ! J’ai pas fais tant de go que ça, par contre si je ne m’abuse, ton exemple pour l’interface est erroné : tu ne l’implémente pas. La preuve si je rajoute une méthode “Pouet” à l’interface, ça compile toujours.

    https://play.golang.org/p/1WaF6J2Au9s

    En revanche si tu définies bien le type de ta variable goDeveloper comme étant de l’interface developer, là il l’utilise bien :

    var goDeveloper Developer = &GoDeveloper{}

    Tout de suite ça parait moins implicite :o)

    ./prog.go:18:9: cannot use &GoDeveloper literal (type *GoDeveloper) as type Developer in assignment:
    *GoDeveloper does not implement Developer (missing Pouet method)

    https://play.golang.org/p/mydj2axxM8i

T'en penses quoi ?

Your email address will not be published. Required fields are marked *