Voici le programme complet. Cliquez sur Run.
Aucune de ces lignes n'est facultative. La suite de cette page explique ce que fait chacune.
Ligne par ligne
package main
Chaque fichier Go commence par une clause package qui nomme le package auquel il appartient. Le nom main est spécial : il marque le package comme un programme exécutable. Tout autre nom (package utils, package hello) crée une bibliothèque que d'autres codes importent mais qui ne peut pas s'exécuter seule.
import "fmt"
import fait entrer un autre package pour que vous puissiez l'utiliser. fmt est le package de formatage et d'affichage de la bibliothèque standard. Après l'import, ses noms exportés s'atteignent via le nom du package : fmt.Println, fmt.Printf, fmt.Sprintf.
Pour importer plusieurs packages, utilisez un bloc entre parenthèses avec un chemin par ligne :
import (
"fmt"
"strings"
)
Go refuse de compiler un fichier qui importe un package qu'il n'utilise pas. Cela garde les listes de dépendances honnêtes, et c'est la première erreur que rencontrent la plupart des gens.
func main()
func déclare une fonction. main dans le package main est le point d'entrée : le programme démarre quand main démarre et se termine quand main retourne. Elle ne prend pas d'argument et ne renvoie rien. Les arguments de ligne de commande viennent de os.Args, et les codes de sortie de os.Exit.
fmt.Println("Hello, World!")
Println affiche ses arguments, met un espace entre eux, et ajoute un retour à la ligne. Le nom commence par une majuscule parce que seuls les noms en majuscule sont exportés d'un package. fmt.println avec un p minuscule est une erreur de compilation.
Afficher plus qu'une chaîne
Println accepte un nombre quelconque de valeurs de n'importe quel type. Printf vous donne le contrôle du format :
%s est remplacé par une chaîne et %d par un entier. Printf et Print n'ajoutent pas de retour à la ligne, donc vous écrivez \n vous-même. Le tableau complet des verbes est sur la page fmt.Printf.
L'exécuter sur votre machine
Une fois Go installé, enregistrez le programme sous main.go dans un dossier vide et lancez-le :
go run main.go
Hello, World!
go run compile le fichier en un binaire temporaire et l'exécute. Pour produire un binaire que vous pouvez garder et copier ailleurs, utilisez go build :
go mod init example.com/hello
go build
./hello
Hello, World!
go build a besoin d'un module (un fichier go.mod), que go mod init crée. Le binaire porte le nom de la dernière partie du chemin du module, hello ici (hello.exe sous Windows). La différence entre run, build et install est expliquée dans go run et go build.
Où sont passés les points-virgules
La grammaire de Go utilise des points-virgules, mais vous n'en tapez presque jamais. Le compilateur en insère un à la fin de toute ligne dont le dernier élément pourrait terminer une instruction : un identifiant, un littéral, ), }, et quelques mots-clés comme return. C'est cette règle qui fait échouer ce style courant dans d'autres langages :
func main()
{
fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {
Un point-virgule a été inséré après func main(), donc la { de la ligne suivante est une erreur. L'accolade ouvrante va toujours sur la même ligne. La même règle s'applique à if, for, switch et à tous les autres blocs.
Premières erreurs, expliquées
Voici les messages que voient les débutants dans leur première heure, exactement tels que Go 1.24 les affiche.
Un import ou une variable inutilisés.
package main
import (
"fmt"
"os"
)
func main() {
x := 5
fmt.Println("hi")
}
./main.go:5:2: "os" imported and not used
./main.go:9:2: declared and not used: x
Les deux sont des erreurs de compilation, pas des avertissements. Supprimez l'import ou la variable. Si vous devez garder une variable pendant le débogage, affectez-la à l'identifiant blanc : _ = x.
Un nom de fonction en minuscule.
./main.go:6:6: undefined: fmt.println
Les noms non exportés sont invisibles hors de leur package. Utilisez fmt.Println.
Le mauvais nom de package.
package example.com/hello is not a main package
Le fichier indique package hello (ou n'importe quoi d'autre que main) et vous avez essayé de l'exécuter. Remplacez-le par package main.
Module manquant.
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
go build et go run . fonctionnent sur des modules. Lancez go mod init example.com/hello une fois dans le dossier. go run main.go, qui nomme un fichier, fonctionne sans module.
Formatage
Go a un seul style de code officiel, et gofmt l'applique. Lancez-le sur chaque fichier que vous écrivez :
go fmt ./...
Il utilise des tabulations pour l'indentation, aligne les commentaires et les champs de struct, et normalise les espacements. Les éditeurs qui gèrent Go le lancent à l'enregistrement. Le code Go se ressemble partout, donc il n'y a rien à configurer et rien à débattre en revue de code.
Questions fréquentes
Comment écrire hello world en Go ?
Enregistrez ceci sous main.go :
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Puis lancez go run main.go. Le programme affiche Hello, World!.
Pourquoi un programme Go a-t-il besoin de package main ?
package main indique au compilateur que ce package est un programme exécutable et non une bibliothèque. Le programme démarre à la fonction main du package main. Tout autre nom de package produit une bibliothèque, et go run la refuse avec « is not a main package ».
Pourquoi l'accolade ouvrante est-elle sur la même ligne en Go ?
Go insère automatiquement des points-virgules à la fin des lignes qui pourraient terminer une instruction, y compris après func main(). Une { sur la ligne suivante ouvrirait alors un bloc séparé, donc le compilateur signale syntax error: unexpected semicolon or newline before {. L'accolade doit être sur la même ligne.
Que signifie fmt en Go ?
fmt est le package de la bibliothèque standard pour les entrées et sorties formatées (le nom est l'abréviation de « format »). fmt.Println affiche ses arguments séparés par des espaces avec un retour à la ligne à la fin ; fmt.Printf affiche à l'aide d'une chaîne de format.