Aller au contenu

State of Go 2025

Présenté au FOSDEM, le state of Go 2025 fait état des derniers changements sur le langage, la bibliothèque standard et son tooling. Découvrez dans cet article où en est Go en 2025

Gopher state of Go 2025
State of Go 2025

Le state of Go 2025 fait état des derniers changements sur le langage, la bibliothèque standard et le tooling. Les évolutions à venir sont discutées ainsi que l’état des communautés du langage dans le monde, le tout présenté avec beaucoup d’humour et de décalage par Maartje Eyskens lors du FOSDEM 2025.

Go a connu deux versions supplémentaires depuis février 2024, Go 1.23 et Go 1.24 ; sa version courante.
Le langage souffle également sa quinzième bougie et sa treizième en tant que version 1.X ce qui en fait officiellement un teenager.

Langage

Quoi de neuf dans le langage ?
Les boucles et itérations, trois nouveaux types de fonctions sont supportées pour les itérateurs iter.Seq et iter.Seq2

  • func(func() bool)
  • func(func(K) bool)
  • func(func(K, V) bool)

Ce qui permet dorénavant de parcourir simplement les lignes d’un fichier :

func (f *File) Lines() iter.Seq[[]byte] {
   data := bytes.Clone(f.data)
   return func(yield func([]byte) bool) {
       for len(data) > 0 {
           line, rest, _ := bytes.Cut(data, []byte{'\n'})
           if !yield(line) {
               return
           }
           data = rest
       }
   }
}

for line := range file.Lines() {
   fmt.Println(line)
}

Autre nouveauté : les alias de types génériques. Il est à présent possible de définir de nouveaux type dans le langage en utilisant des type génériques, exemple créer un nouveau type set à partir du type map :  

type set[P comparable] = map[P]bool

Tooling

Le tooling de Go n’est pas en reste et notamment go vet, l’outil d’analyse statique de code.
Il avertit notamment lorsqu’une feature du langage est utilisée mais non disponible dans la version spécifiée dans le go.mod du projet.
Les paramètres manquants sur les fonctions sont aussi levés : 

msg := "Hello FOSDEM!"
fmt.Printf(msg)
./main.go:7:13: non-constant format string in call to fmt.Printf

De nouveaux warning également lorsque les versions sont définies avec des versions de patch //go:build 1.23.4 et d’autres warning sur les déclarations de tests, fuzzers, benchmarks et pour les exemples embarqués.

La grande nouveauté s’adresse aux devops et à la CI, le tooling Go s’offre une nouvelle option -json pour permettre un parsing simplifié des outputs. Exemple sur les tests :

# go test ./… -json
{"Time":"[..]","Action":"output","Package":"github.com/cofide/cofide-sdk-go/id",
"Test":"TestSPIFFEID_Matches/Simple_isNotEmpty_mismatch",
"Output":"--- PASS: TestSPIFFEID_Matches/Simple_isNotEmpty_mismatch (0.00s)\n"}

Plus besoin de contournement dans un Makefile pour récupérer la version de vos sources depuis votre repository, le tooling gère nativement ces informations maintenant : 

  • Récupère le tag ou le commit
  • Ajoute un suffix +dirty sur les modifications non commitées
  • Se désactive avec -buildvcs=false 

Exemple de récupération de ces informations dans le code : 

func main() {
   build, ok := debug.ReadBuildInfo()
   if !ok {
       fmt.Println("No build info available")
       return
   }
   fmt.Printf("version: %s\n", build.Main.Version)
}

# git init
# git add main.go && git commit
# go build ./ && ./fosdem
version: v0.0.0-20250127161208-43ca0d8d44c4

Les Tools utilisés dans le code (pprof, etc.) peuvent à présent être déclarés dans les manifests go.mod, voir la documentation des Tools pour plus de détails. 

Autre sujet à grand débat dans la communauté: la télémétrie de Go. Une proposition d’activer par défaut la télémétrie dans le tooling Go pour récupérer des données d’utilisation anonymes a secoué la toile il y a quelques mois.
Pour 2025, la télémétrie est toujours opt-in par défaut, il vous faudra l’activer de vous même.
Un nouveau design stock les informations d’utilisation localement et les envoie en cas d’activation. 

Bibliothèque standard

🔁 La bibliothèque standard s’est vue ajouter diverses fonctions helper pour les itérateurs : All, Keys, Values, Insert, Collect, Sorted…

names := []string{"Alice", "Bob", "Vera"}
for i, v := range slices.Backward(names) {
  fmt.Println(i, ":", v)
}

2 : Vera
1 : Bob
0 : Alice

🔐 Concernant la sécurité les cipher 3DES ont été supprimés du langage. Attention, c’est un breaking change.

Le nouveau protocole d’échange de clés TLS Hello (Encrypted Client Hello ou ECH) est disponible, de même que les systèmes d’échange de clés post-quantum

Le package RSA refuse à présent les clés de moins de 1024 bits, ceci est aussi un breaking change, pensez à vérifier vos applications.

D’autres bibliothèques de chiffrement sont passées de leur version d’incubation à la version stable : crypto/hkdf, crypto/pbkdf2, et crypto/sha3 déplacées de /x/crypto vers la bibliothèque standard. Enfin le package crypto/mlkem implémente l’échange de clés post quantum FIPS 203.

😈 Un bac à sable permet à présent de parcourir un système de fichier de manière sécurisée os.OpenRoot(“chemin”) et d’éviter les évasions du type http://site/app?path=../../../../../…/etc/passwd, même avec des liens symboliques.

➡️ Un nouveau package weak permet de manipuler en bas-niveau des weaks pointers pour créer des structures de cache efficace en mémoire.

🚙 Sur Linux, le support Multi-Path TCP est à présent disponible, c’est utile pour les devices mobiles, pour la performance et les connexions restent actives sur changement d’IP.

👺 Ajout d’une nouvelle annotation omitzero pour éviter d’avoir des attributs à valeur zéro dans les JSON.

type TrainStation struct {
   Name     string `json:"name,omitempty"`
   UICCode  int `json:"uic_code,omitzero"`
   OpenDate time.Time `json:"open_date,omitzero"`
}

✅ Les packages de testing introduisent une virtualisation du temps pour les tests.
synctest.Run démarre les goroutines dans une bulle temporelle, le package time y est simulé dans le cadre de ces tests.
La méthode synctest.Wait attend la fin des goroutines.
Les nouveaux T.Context and B.Context retournent un context qui est annulé à la fin des tests.
T.Chdir permet à présent de changer de répertoire pendant les tests ou leur équivalent en benchmark.

🔂Un nouveau package fait son apparition : Unique: il permet de comparer rapidement des objets entre eux. 

struct1 := ComplexStruct{Number: 1}
struct2 := ComplexStruct{Number: 1}
u1 := unique.Make(struct1)
u2 := unique.Make(struct2)
if u1 == u2 {
    fmt.Println("u1 == u2") // This will be printed
} else {
    fmt.Println("u1 != u2")
}

⏰ On notera aussi une meilleure gestion en mémoire des Timer et Ticker qui seront à présent garbage collectés si non référencés, même s’ils ne sont pas arrêtés.

🇨🇭Une nouvelle implémentation des Map ("Swiss Maps") qui a également fait l'objet d’un talk dédié dans cette room a été introduite.
Cette implémentation ainsi que celle des Mutex a permis un gain de 2% à 3% des performances de cette mouture 1.24 de Go.

👴D’un point de vue support des architectures du langage on note les informations suivantes : 

  • L’ajout du support expérimental en Go 1.23 de openbsd/riscv64
  • La prochaine version Go 1.25 demandera d’avoir macOS 12 Monterey ou plus récent
  • Go 1.24 ne supporte plus les architectures 32 bits windows/arm(32)
  • Go 1.23 est la dernière à supporter le Linux kernel version 2.6.32 (2010) ou ultérieure
  • Go 1.24 demandera à tourner sur un noyau 3.2 (2012) ou ultérieur.

🕸️ Le Webassembly poursuit son chemin au travers de Go 1.24 avec une nouvelle directive go:wasmexport qui permet d’exporter des fonctions depuis l’hôte WebAssembly. De nouveaux types sont à présent supportés via go:wasmimport.

Le futur de Go : Go 2.0 and Design Drafts

Des réflexions sont en cours autour d’un nouveau Garbage Collector (GC) afin de réduire encore davantage le coût du GC via les Memory Regions. Plus d’informations sur le sujet avec la proposition de design sur le sujet.

Les communautés

Les communautés se maintiennent et les conférences à venir sont listées ci-dessous : 

Avant de partir

En conclusion, un langage qui poursuit son évolution tout en restant compatible avec son histoire de plus de quinze ans. Une communauté constante si l’on s'en tient à l’indicateur de fréquentation des Room au FOSDEM, comme le dit Maartje, le seul indicateur qui compte.

Dans un moment où Rust et surtout Python attirent beaucoup de nouveaux développeurs, Go a su se maintenir. Les entreprises sont nombreuses à emprunter le chemin d’un déploiement à l’échelle de l’IA, la performance et la simplicité de prise en main de Go en font toujours un langage à considérer pour ces nouvelles applications.

Dernier