> ## Content Index
> Fetch the complete content index at: https://www.sfeir.dev/llms.txt
> Use this file to discover other available public pages before exploring further.

# State of Go 2025
- URL: https://www.sfeir.dev/state-of-go-2025/
- Published: 2025-02-27T09:22:16.000Z
- Updated: 2025-03-04T12:57:53.000Z
- Description: 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
- Author: Sébastien  Friess
- Tags: GoLang, FOSDEM, Langage, Conference, open source

Le [state of Go 2025](https://docs.google.com/presentation/d/1HuAEgJ2wdFWowo5WrOzoNCaTnMqrpABEr53DZM3MMRU/edit?usp=sharing&ref=sfeir.dev) 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](https://blahaj.social/@maartje?ref=sfeir.dev) lors du [FOSDEM 2025](https://www.sfeir.dev/mon-fosdem-2025-prefere-2/).

Go a connu deux versions supplémentaires depuis février 2024, Go [1.23](https://tip.golang.org/doc/go1.23?ref=sfeir.dev) et Go [1.24](https://tip.golang.org/doc/go1.24?ref=sfeir.dev) ; 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](https://go.dev/blog/range-functions?ref=sfeir.dev) *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 :

```go
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* : 

```go
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 : 

```go
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](https://www.sfeir.dev/back/le-devops-pourquoi-en-faire/) et à la CI, le tooling Go s’offre une nouvelle option *\-json* pour permettre un parsing simplifié des outputs. Exemple sur les tests :

```bash
# 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 : 

```go
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](https://tip.golang.org/doc/modules/managing-dependencies?ref=sfeir.dev#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. 

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXd18g1gkGCheM61_wWICS4Gvgzuryy4y1vqB2NpE_y8k4Ow8kSZw6nbkVZxAdBefJnQTcJbSEa0xYXSj0XRuKu6uj71NMOXmtxPXsNxKt4F3Gabl1JPhLz76nCB_s04iyECOQGX5g?key=oGF-ZIE_eS366ohAOVjpM5MC)

## Bibliothèque standard

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

```go
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](https://tip.golang.org/pkg/crypto/tls?ref=sfeir.dev#X25519MLKEM768). 

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](https://www.sfeir.dev/tendances/linus-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.

```go
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 s*ynctest.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. 

```go
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](https://go.googlesource.com/proposal/+/d79dc87fa59e4b8614b56e57b84b4cb391bcc8f7/design/70257-memory-regions.md?ref=sfeir.dev) sur le sujet.

## Les communautés

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXck5HeaVOpeG4pvBg1evPrh6SYcxS5K2rHyrTZwao8yIPBXf5m-QBaqRkeF8KmKkonWUN-F4U0bJU2PLCcvn0d4TxLz2wlH46hoc6bzZjpMHBnL7MEwzJrMmPpSvvr8LPi2H1fO8g?key=oGF-ZIE_eS366ohAOVjpM5MC)

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

- [Gophercon Latam](https://gopherconlatam.org/?ref=sfeir.dev) Brazil 5-6 mai 2025
- [GopherCon Europe ](https://gophercon.eu/?ref=sfeir.dev)Berlin 16-19 juin 2025
- [Gophercon New York](https://www.gophercon.com/?ref=sfeir.dev) 26-28 août 2025

## 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](https://www.sfeir.dev/front/et-si-rust-etait-prod-ready-pour-le-developpeur-ts/) et surtout [Python](https://www.sfeir.dev/kesaco-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](https://info.sfeir.com/fr/fr/sfeir-school-go?ref=sfeir.dev) en font toujours un langage à considérer pour ces nouvelles applications.