URL: https://linuxfr.org/news/sortie-du-langage-go-en-version-1-6 Title: Sortie du langage Go en version 1.6 Authors: wilk esdeem, Davy Defaud, Lucas, Benoît Sibaud, M5oul, claudex et palm123 Date: 2016年02月17日T21:46:53+01:00 License: CC By-SA Tags: golang, langage_go, sortie_version, rob_pike, ken_thompson et robert_griesemer Score: 72 Go est un langage libre créé par Rob Pike (UTF-8), Ken Thompson (Unix) et Robert Griesemer (V8) dont le but était de « régler les problèmes de Google ». Il se retrouve finalement apte à résoudre des problèmes bien plus divers. Go est un langage compilé à typage statique, dont l’objectif est de rester le plus simple possible tout en incluant les fonctionnalités indispensables d’aujourd’hui : réseau, concurrence, Unicode, ramasse‐miettes, outils de développement... À titre d’exemple, un serveur Web avec la bibliothèque standard se résume à quelques lignes : ```go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) } ``` ---- [Release notes](https://tip.golang.org/doc/go1.6) [Go](https://golang.org) [Ask me anything (Reddit avec les core devs Go)](https://www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/) [Intruduction à Go 1.6 et l’évolution de Go (humoristique en plus) par Brad Fitzpatrick](https://docs.google.com/presentation/d/1JsCKdK_AvDdn8EkummMNvpo7ntqteWQfynq9hFTCkhQ/present) [Dernière dépêche à propos du livre « The Go Programming Language » de Kernighan & Donovan](http://linuxfr.org/news/the-go-programming-language) [Sur les avantages de la simplicité en programmation](http://dave.cheney.net/2015/03/08/simplicity-and-collaboration) [Tutoriel officiel](https://go-tour-fr.appspot.com) ---- #Description Cette simplicité dans la syntaxe s’accompagne de quelques fonctionnalités propres détaillées ci‐dessous. ### Les goroutines Une instruction du langage `go func()` permet de lancer une fonction en concurrence de manière très légère, on peut en lancer des milliers, réparties automatiquement sur plusieurs fils d’exécution (_threads_) ou cœurs. ### Les channels Pour synchroniser les différentes _goroutines_, il est possible soit d’utiliser des mécanismes classiques de verrous soit des _channels_. Des canaux à travers lesquels les _goroutines_ s’envoient des objets typés. ```go package main import "fmt" func sum(x, y int, c chan int) { c <- x + y } func main() { c := make(chan int) go sum(24, 18, c) fmt.Println(<-c) } ``` ###Interfaces et composition Il n’y a pas de classes en Go. On utilise des interfaces qui définissent un ensemble de méthodes sur un objet. Un type implémente une interface lorsqu’il implémente toutes les fonctions définies par cette interface. Le compilateur se charge de cette vérification automatiquement. Il n’y a pas d’héritage, les types (interfaces et structures comprises) peuvent être composés. ###defer L’instruction `defer` permet de lancer une fonction à la fin de la fonction qui le contient, pour fermer un fichier par exemple. ## Les outils Les outils standards facilitent grandement le travail et le partage de code : - `gofmt` permet de formater le code de manière conventionnelle ; - `go run` permet de compiler et lancer un programme immédiatement à la manière d’un langage interprété ; il n’y a besoin ni de fichier `include` ni de `makefile` ; - `go get` permet d’installer un paquet (la gestion des versions de paquets est en cours de standardisation). # Nouveautés de la version 1.6 # ## Changements au niveau du langage Aucun ! Merci, la dépêche est terminée vous pouvez changer d’onglet. C’est une promesse tenue, la compatibilité ascendante est conservée. Mais surtout, la simplicité reste une fonctionnalité. Les bases sont posées et ne bougeront pas de sitôt. Le développement du langage laisse toute la place au développement de l’implémentation et de tout ce qui peut tourner autour. Brad Fitzpatrick a fait une [présentation de Go 1.6](https://docs.google.com/presentation/d/1JsCKdK_AvDdn8EkummMNvpo7ntqteWQfynq9hFTCkhQ/present) et parle de l’évolution à venir du langage. C’est assez humoristique et instructif. Je vous laisse découvrir. ## Changements au niveau de la bibliothèque standard Aucun au niveau de l’API. Là encore, il s’agit d’une promesse de compatibilité. # HTTP2 Le package `net/http` (client et serveur) prend en charge HTTP2 de manière transparente. # Performances Les performances sont légèrement améliorées, en particulier le GC — _garbage collector_ ou ramasse‐miettes — dont les pauses sont de l’ordre de quelques millisecondes, quelle que soit la taille du tas. Les temps de compilations restent identiques ; toutefois, ils sont toujours supérieurs à la version 1.4 qui était codée en C. Quelques bibliothèques bénéficient d’un gain significatif de l’ordre de 10 % comme `compress/bzip2`, `compress/gzip`, `crypto/aes`, `crypto/elliptic`, `crypto/ecdsa` et `sort`. # Situation de compétition Comme chacun sait, un dictionnaire (`map`) ne doit pas être utilisé en lecture si une _goroutine_ y accède en écriture. Cette erreur est maintenant détectée automatiquement (avant, il fallait lancer le `race detector`). Attention, le programme va faire un `panic` ! Il vaut donc mieux lancer le `race detector` avant de passer une application en 1.6. # Trace d’appel Lors d’un crash, toutes les _goroutines_ étaient affichées jusqu’à présent. Dorénavant, seule celle qui a planté sera affichée. Pour retrouver le fonctionnement précédent, il faut mettre à jour la variable d’environnement `GOTRACEBACK` à `all`. #Tris Les tris sont légèrement plus rapides. Attention, l’ordre des égalités n’étant jamais garanti, le résultat sera peut‐être différent de la version 1.5. Pour assurer un ordre des égalités constant, il faut utiliser la fonction `Stable`. #Template Deux ajouts particulièrement importants avec la possibilité d’éviter les espaces autour des expressions. Le signe `-` avant ou après va éviter d’avoir des espaces et un saut de ligne avant ou après l’action. Par exemple : ```go {{23 -}} < {{- 45}} ``` Va donner `23<45` Et une nouvelle action `{{block}}` associée à la possibilité de redéfinir un modèle nommé qui permet de redéfinir des parties d’un modèle. Pour aller plus loin, on se référera à l’[exemple donné dans la documentation](https://golang.org/pkg/text/template/#example_Template_block). # Autres On retrouvera un nombre assez important d’ajouts mineurs dans la bibliothèque standard indiqués dans la [note de version](https://tip.golang.org/doc/go1.6). ## Gestion des dépendances externes ou _vendoring_ Pour permettre d’inclure les bibliothèques externes utilisées dans le répertoire `vendor/`, la variable d’environnement `GO15VENDOREXPERIMENT` en option dans la version 1.5 est maintenant active par défaut. La spécification d’un `lock file` pour les paquetages `vendor/` est en cours de mise au point et permettra à terme d’être utilisée par `go get`. ## Go 1.7 Les développeurs travaillent maintenant à la version 1.7 qui sortira dans six mois. Ils ont participé à un [« _ask me anything_ » instructif sur _reddit_](https://www.reddit.com/r/golang/comments/4353p4/go_17_plans/). Il n’est pas prévu de modifier quoi que ce soit dans le langage, même s’ils sont tous conscients qu’il n’est pas toujours parfait. Au niveau de l’implémentation, ils travaillent toujours sur des améliorations du ramasse‐miettes, même si les résultats actuels sont considérés comme largement suffisants. Au niveau du compilateur, il est question d’utiliser [SSA](https://godoc.org/golang.org/x/tools/go/ssa), censé faciliter les optimisations et la taille de l’exécutable. Toutefois, il est assuré que cela ne se fera pas au détriment du temps de compilation (celui‐ci, bien que toujours extrêmement court, a augmenté au moment de la réécriture du compilateur de C en Go). L’optimisation est donc toujours une priorité pour de nombreux développeurs du langage. Ainsi, par exemple, les `pkg/.a` seront zippés et la bibliothèque `zip` sera optimisée. La stabilité du langage et celle de l’API de la bibliothèque standard, ainsi que les excellentes performances doivent maintenant permettre de travailler sur l’écosystème, les paquetages externes et les outils.

AltStyle によって変換されたページ (->オリジナル) /