Les développeurs Go s'habituent rapidement à la syntaxe : fonctions, interfaces, erreurs. Mais presque immédiatement après « Hello, world », quelque chose de mystérieux commence à apparaître dans le code : context.Context. Et pas seulement quelque part dans les profondeurs du paquet, mais directement dans la signature de chaque seconde fonction. À quoi sert-il et pourquoi ne peut-on pas s'en passer ?
Voyons cela de plus près.

Qu'est-ce que le contexte dans Go
context.Context est un objet spécial qui est transmis via une chaîne d'appels et gère :
durée de vie des opérations,
l'annulation des processus,
les délais,
transfert de métadonnées (par exemple, ID de requête).
Le contexte est comme un « sac à dos invisible » que la fonction reçoit avec l'appel et à partir duquel vous pouvez obtenir des informations utiles.
Où le contexte est le plus souvent rencontré
Gestion des requêtes réseau — annulation par timeout, si la réponse ne vient pas trop longtemps.
Requêtes à la base de données — pour ne pas garder la connexion « en attente » indéfiniment.
Fond de la chambre de combustion — graceful shutdown à la fin du service.
Pourquoi est-il présent dans presque tous les arguments
Go adhère au principe : le manifeste est meilleur que l'implicite. Au lieu de variables globales ou de signaux cachés, les fonctions reçoivent directement le contexte. Cela rend le code prévisible et donne le contrôle au niveau supérieur, d'où la requête commence.
func fetchUser(ctx context.Context, id int) (User, error) {
row := db.QueryRowContext(ctx, "SELECT name FROM users WHERE id=?", id)
...
}Si la requête a été définie sur ctx avec un délai d'attente, toute opération à l'intérieur s'arrêtera automatiquement après le délai d'attente.

Méthodes de travail importantes
Création d'un contexte avec un délai d'attente :
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()Annulation manuelle :
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(time.Second)
cancel() // arrêtons le travail de tous ceux qui écoutent ce ctx
}()Transfert de valeurs (attention !) :
ctx = context.WithValue(ctx, "requestID", "abc123")Important : abuser de WithValue ne vaut pas la peine — il s'agit plutôt de « métadonnées » que de données à part entière.
Erreurs et pièges typiques
N'a pas appelé
cancel()→ fuite de ressources.On met tout dans
WithValue→ la lisibilité est perdue.Nous ne transmettons pas le contexte plus loin → nous privons la fonction de la possibilité de se gérer elle-même.
L'idée principale de context est simple : le contrôle doit être avec le code appelant, pas avec le code appelé. C'est pourquoi dans Go, presque toutes les fonctions publiques du paquet de la bibliothèque standard commencent par l'argument ctx.
Le contexte n'est pas seulement un mot à la mode dans Go. Il s'agit d'un outil intégré qui rend vos programmes prévisibles, gérables et protégés contre les blocages. Plus tôt vous commencerez à l'utiliser correctement, moins vous aurez de « douleurs » à l'avenir.
Le Code est apparu nouveau cours de pointe sur Go 🚀
C'est un début puissant et compréhensible pour ceux qui veulent maîtriser le langage dans lequel sont écrits des services rapides et fiables. Dans le cours, nous expliquons tout en termes simples : des premiers pas aux concepts sérieux tels que les goroutines et les contextes.
Et nous avons aussi un confortable chaîne de télégram, où nous partageons les actualités du monde de l'informatique, analysons des tâches intéressantes et communiquons avec la communauté. Abonnez-vous pour ne rien manquer de l'essentiel.
