Petits pièges en Go

Lors des meetups Golang Paris, nous avons vu quelques trucs et astuces et pièges courant en Go. Voici un compte-rendu et bouts de codes.

Petits pièges en Go

Les meetups Golang Paris sont un moment privilégiés pour faire du code, avoir du retour d'expérience bref monter en compétence et rencontrer des gens sympas. N'hésitez pas à vous inscrire et à venir:

https://www.meetup.com/fr-FR/Golang-Paris/

et aussi  à consulter la page github également:

Golang Paris interest group
Gophers from the greater Paris area (you know... the place with that tall metal thingy) - Golang Paris interest group

Utilisation de Go routines et assignation de variables

Nous allons montrer un piège qui est arrivé sur un exemple plus complexe à la base mais qui peut se résumer ainsi:

  • Nous partons d'un bout de code simple qui boucle et affiche le contenu de la variable "i" dans une Go routine
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Demo on goroutines seq")

	for i := 0; i < 10; i++ {
		go func() {
			fmt.Println("Val i: %d", i)
		}()
	}
}

Si vous executez ce code : https://play.golang.org/p/PyMsrChN-ZD
vous verrez uniquement `Demo on goroutines seq` d'affiché : le programme effectue la boucle et sort avant qu'il n'ait le temps de lancer les routines.

  • Ajoutons un sleep à la fin.
package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("Demo on goroutines seq")

	for i := 0; i < 10; i++ {
		go func() {
			fmt.Printf("Val i: %d\n", i)
		}()
	}

	time.Sleep(500 * time.Millisecond)
}

et maintenant, que devons nous voir: 10 lignes avec ` Val i: 10 `.
Encore une fois, les routines sont lancées une fois que la boucle est terminée. Les routines sont créées avec une référence sur la variable "i" et non pas une copie.

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("Demo on goroutines seq")

	for i := 0; i < 10; i++ {
		go func(cpt int) {
			fmt.Printf("Val i: %d\n", cpt)
		}(i)
	}

	time.Sleep(500 * time.Millisecond)
}

et vous voila avec une boucle qui affiche les chiffres de 0 à 9, mais en parallèle!

Les slices et leur valeur sous-jacente

Regardez l'exemple de code disponible sur le repo de Meetup Golang Paris:

GolangParis/dont-panic
Du fait des dérèglements climatiques affectant le taux de reproduction de l’espèce : l’état d’urgence a été décrété. Ne pas céder à la panic. - GolangParis/dont-panic

Sans revenir sur une description poussée des slices, ceux-ci peuvent être liés à un tableau sous-jacent. Si vous ne changez pas la capacité du slice, il y a la même référence que le tableau mais dans le cas d'une nouvelle allocation, vous changez d'emplacement.

Ce cas est à garder en tête car il peut être difficile à débugger et se comporter comme "un bug aléatoire".