Démarrer un serveur web en Go (Golang)
Introduction aux serveurs web en Go
Go (Golang) est un langage rapide et compilé. L’une des forces de Go est la facilité à créer et lancer des serveurs web. Dans cette leçon, vous allez découvrir comment créer votre premier serveur HTTP et gérer différentes routes.
📌 Une route est une partie de l’URL qui permet de gérer des requêtes HTTP spécifiques et d’exécuter une fonction dédiée. Cela permet d’afficher du contenu adapté en fonction du chemin présent dans l’URL.

Serveur HTTP basique
Créer un premier serveur HTTP
Le package net/http
est inclus de base dans Go.
Il permet de créer un serveur basique :
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Bienvenue sur mon serveur Go !")
})
fmt.Println("Serveur démarré sur le port 8080...")
http.ListenAndServe(":8080", nil)
}
Ici, on utilise http.HandleFunc("/", ...)
pour associer la racine /
à un handler anonyme qui répond par Bienvenue sur mon serveur Go !
. Ensuite, http.ListenAndServe(":8080", nil)
lance le serveur sur le port 8080
.
Un handler est une fonction qui traite une requête HTTP et génère une réponse. 😉
Ouvrir la page
Pour vérifier que votre site fonctionne bien en local, ouvrez un navigateur de votre choix (par exemple Google Chrome) et ensuite tapez dans la barre d'adresse : http://localhost:8888/
!
Normalement le message suivant devrait apparaître :

Couper le serveur web dans Go
Pour arrêter votre serveur web Go, utilisez simplement la combinaison de touches suivante dans votre terminal :
CTRL + C
Cette combinaison interrompt l’exécution du programme et arrête le serveur immédiatement.
Qu'est-ce que : w http.ResponseWriter
et r *http.Request
?
r *http.Request
?
r *http.Request
est un pointeur vers la requête HTTP reçue. C’est un objet (struct) qui contient toutes les informations sur la requête entrante.
- La méthode (GET, POST, etc.) via
r.Method
- L’URL (chemin, query string, etc.) via
r.URL
- Les en-têtes (headers) via r.Header
- Le corps (body) de la requête (pour POST, PUT, etc.) via
r.Body
- etc...
Pourquoi un pointeur *http.Request
?
La struct
http.Request
est assez volumineuse : elle contient beaucoup d’informations.
Si on passait r
par valeur (sans *
), on ferait une copie complète de cette struct
, ce qui serait moins efficace.
Avec r *http.Request
, vous évitez de copier la requête, et vous pouvez (le cas échéant) modifier certains champs directement.
Nous avons exploré les avantages d’utiliser des pointeurs plutôt que de copier une struct dans la leçon sur les pointeurs.
w http.ResponseWriter
?
http.ResponseWriter
est une type interface fourni par le package net/http
. Cette interface définit les méthodes pour écrire la réponse HTTP (ex. Write
, Header
, etc.)
Elle permet donc d'écrire des données vers le client (navigateur, ...) et de définir les en-têtes (headers) et le code de statut HTTP.
Différentes routes pour différentes pages.
Créer plusieurs routes
Pour gérer plusieurs chemins (routes) dans votre serveur web, vous pouvez simplement appeler plusieurs fois la méthode http.HandleFunc
, en associant à chaque route une fonction de gestion (handler) différente.
Par exemple, vous pouvez définir un handler pour la page d’accueil, un autre pour la page « À propos », un troisième pour la page « Contact », etc.
package main
import (
"fmt"
"net/http"
)
// Handler pour la page d'accueil
func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Bienvenue sur la page d’accueil !")
}
// Handler pour la page "À propos"
func aboutHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Ceci est la page À propos.")
}
// Handler pour la page "Contact"
func contactHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Page Contact : envoyez-nous un message !")
}
func main() {
// Association de la route "/" avec homeHandler
http.HandleFunc("/", homeHandler)
// Association de la route "/about" avec aboutHandler
http.HandleFunc("/about", aboutHandler)
// Association de la route "/contact" avec contactHandler
http.HandleFunc("/contact", contactHandler)
fmt.Println("Serveur démarré sur le port 8080...")
// Démarre l'écoute sur le port 8080
http.ListenAndServe(":8080", nil)
}
Lancez le serveur :
go run main.go
Chaque route correspond à une page.
Route : /

Route : /about

Route : /contact
