| name | go |
| description | Guide complet du langage Go — syntaxe, goroutines, channels, interfaces, tests, modules, patterns concurrents et écosystème. En français. |
Go (Golang) — Guide Complet (Français)
Langage compilé, concurrent, à garbage collector. Go 1.22+.
1. Installation et Outils
wget https://go.dev/dl/go1.22.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
go mod init mon-projet
go build
go run main.go
go test ./...
go fmt ./...
go vet ./...
2. Syntaxe de Base
package main
import "fmt"
func main() {
var x int = 42
var y float64 = 3.14
var nom string = "Go"
var actif bool = true
z := 100
message := "Bonjour"
const Pi = 3.14159
const MaxRetries = 3
var arr [5]int
arr[0] = 1
arr2 := [3]string{"a", "b", "c"}
slice := []int{1, 2, 3, 4, 5}
slice = append(slice, 6)
sousEnsemble := slice[1:4]
fmt.Println(len(slice), cap(slice))
scores := map[string]int{
"Alice": 95,
"Bob": 87,
}
scores["Charlie"] = 92
delete(scores, "Bob")
valeur, existe := scores["Bob"]
type Personne struct {
Nom string
Age int
Email string
}
alice := Personne{Nom: "Alice", Age: 30, Email: "alice@mail.com"}
fmt.Println(alice.Nom)
}
3. Structures de Contrôle
if x > 0 {
fmt.Println("Positif")
} else if x < 0 {
fmt.Println("Négatif")
} else {
fmt.Println("Zéro")
}
if err := faireQuelqueChose(); err != nil {
fmt.Println("Erreur :", err)
}
for i := 0; i < 10; i++ {
fmt.Println(i)
}
for condition {
}
for {
break
}
for i, v := range slice {
fmt.Printf("Index %d : %v\n", i, v)
}
for cle, valeur := range scores {
fmt.Printf("%s → %d\n", cle, valeur)
}
switch jour {
case "lundi", "mardi":
fmt.Println("Début de semaine")
case "vendredi":
fmt.Println("Bientôt le weekend")
default:
fmt.Println("Milieu de semaine")
}
switch {
case x < 0:
fmt.Println("Négatif")
case x == 0:
fmt.Println()
:
fmt.Println()
}
4. Fonctions
func Additionner(a, b int) int {
return a + b
}
func Diviser(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("division par zéro")
}
return a / b, nil
}
func Calculer(a, b int) (somme int, produit int) {
somme = a + b
produit = a * b
return
}
func Somme(nombres ...int) int {
total := 0
for _, n := range nombres {
total += n
}
return total
}
operation := func(a, b int) int { return a * b }
fmt.Println(operation(3, 4))
type Compte struct {
Solde
}
Deposer(montant ) {
c.Solde += montant
}
Afficher() {
fmt.Sprintf(, c.Solde)
}
5. Gestion d'Erreurs
func LireFichier(chemin string) ([]byte, error) {
data, err := os.ReadFile(chemin)
if err != nil {
return nil, fmt.Errorf("lecture de %s : %w", chemin, err)
}
return data, nil
}
func TraiterFichier(chemin string) error {
f, err := os.Open(chemin)
if err != nil {
return err
}
defer f.Close()
return nil
}
func FonctionProtegee() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Récupéré de :", r)
}
}()
panic("quelque chose de grave")
}
6. Interfaces
type Formateur interface {
Formater() string
}
type Personne struct {
Nom string
Age int
}
func (p Personne) Formater() string {
return fmt.Sprintf("%s (%d ans)", p.Nom, p.Age)
}
func Afficher(f Formateur) {
fmt.Println(f.Formater())
}
func Decrire(v interface{}) {
fmt.Printf("Type: %T, Valeur: %v\n", v, v)
}
var f Formateur = Personne{"Bob", 25}
p, ok := f.(Personne)
if ok {
fmt.Println(p.Nom)
}
switch v := f.(type) {
case Personne:
fmt.Println("Personne :", v.Nom)
case string:
fmt.Println("Chaîne :", v)
default:
fmt.Printf("Inconnu : %T\n", v)
}
7. Concurrence (Goroutines et Channels)
go func() {
fmt.Println("Concurrent")
}()
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Printf("Goroutine %d\n", id)
}(i)
}
wg.Wait()
ch := make(chan int)
ch := make(chan int, 10)
ch <- 42
valeur := <-ch
func Envoyer(ch chan<- int, v int) { ch <- v }
func Recevoir(ch <-chan int) int { return <-ch }
select {
case msg1 := <-ch1:
fmt.Println("Reçu de ch1 :", msg1)
msg2 := <-ch2:
fmt.Println(, msg2)
<-time.After( * time.Second):
fmt.Println()
ch3 <- :
fmt.Println()
:
fmt.Println()
}
valeur := ch {
fmt.Println(valeur)
}
(ch)
mu sync.Mutex
compteur
i := ; i < ; i++ {
{
mu.Lock()
compteur++
mu.Unlock()
}()
}
8. Generics (Go 1.18+)
func Premier[T any](slice []T) (T, bool) {
if len(slice) == 0 {
var zero T
return zero, false
}
return slice[0], true
}
type Numerique interface {
~int | ~int64 | ~float64
}
func Somme[T Numerique](nombres []T) T {
var total T
for _, n := range nombres {
total += n
}
return total
}
type Pile[T any] struct {
elements []T
}
func (p *Pile[T]) Push(v T) {
p.elements = append(p.elements, v)
}
func (p *Pile[T]) Pop() (T, bool) {
if len(p.elements) == 0 {
var zero T
return zero, false
}
v := p.elements[len(p.elements)-1]
p.elements = p.elements[:len(p.elements)]
v,
}
9. Tests et Benchmarks
package monmodule
import "testing"
func TestAddition(t *testing.T) {
resultat := Additionner(2, 3)
if resultat != 5 {
t.Errorf("Additionner(2, 3) = %d; attendu 5", resultat)
}
}
func TestAdditionner(t *testing.T) {
tests := []struct {
nom string
a, b int
attendu int
}{
{"positifs", 2, 3, 5},
{"negatifs", -1, -1, -2},
{"zero", 0, 5, 5},
}
for _, tt := range tests {
t.Run(tt.nom, func(t *testing.T) {
if got := Additionner(tt.a, tt.b); got != tt.attendu {
t.Errorf("=%d; attendu %d", got, tt.attendu)
}
})
}
}
func BenchmarkAdditionner(b *testing.B) {
for i := 0; i < b.N; i++ {
Additionner(1, 2)
}
}
10. Modules et Packages
module github.com/utilisateur/monprojet
go 1.22
require (
github.com/gin-gonic/gin v1.9.1
)
package utils
func Publique() {}
func privee() {}
type MonType struct {
Public string
prive int
}
11. Écosystème Web (Gin)
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "pong"})
})
r.POST("/utilisateurs", func(c *gin.Context) {
var utilisateur struct {
Nom string `json:"nom"`
Email string `json:"email"`
}
if err := c.ShouldBindJSON(&utilisateur); err != nil {
c.JSON(400, gin.H{"erreur": err.Error()})
return
}
c.JSON(201, utilisateur)
})
r.Run(":8080")
}
Références