0Pricing
Go Academy · Leçon

Structs anonymes et composition

Intégration et réutilisation du code fondée sur les structs

Structs anonymes et composition est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Structures anonymes

Une structure anonyme n'a pas de type nommé. Elle est définie directement à l'endroit où elle est utilisée et convient aux données de courte durée, aux tests pilotés par tableau et aux regroupements ponctuels :

package main
import "fmt"

func main() {
    point := struct{ X, Y int }{X: 3, Y: 7}
    fmt.Println(point.X, point.Y)
}

Structures anonymes dans les tests pilotés par tableau

Un idiome Go courant consiste à utiliser une tranche de structures anonymes pour les tests pilotés par tableau :

package main
import "fmt"

func double(n int) int { return n * 2 }

func main() {
    tests := []struct{ input, want int }{
        {1, 2}, {5, 10}, {0, 0},
    }
    for _, tt := range tests {
        got := double(tt.input)
        if got != tt.want {
            fmt.Printf("FAIL: double(%d) = %d, want %d\n", tt.input, got, tt.want)
        }
    }
    fmt.Println("all tests passed")
}

Intégration de structures

L'intégration d'un type dans une structure expose ses champs et ses méthodes dans la structure englobante :

package main
import "fmt"

type Animal struct{ Name string }
func (a Animal) Speak() string { return a.Name + " speaks" }

type Dog struct {
    Animal        // embedded
    Breed string
}

func main() {
    d := Dog{Animal: Animal{"Rex"}, Breed: "Labrador"}
    fmt.Println(d.Name)    // promoted field
    fmt.Println(d.Speak()) // promoted method
}

Intégration multiple

Une structure peut intégrer plusieurs types. Les conflits (même nom de champ ou de méthode) doivent être résolus explicitement :

package main
import "fmt"

type Logger struct{}
func (Logger) Log(s string) { fmt.Println("[LOG]", s) }

type Metrics struct{}
func (Metrics) Count() int { return 42 }

type Service struct {
    Logger
    Metrics
    Name string
}

func main() {
    svc := Service{Name: "auth"}
    svc.Log("started")       // from Logger
    fmt.Println(svc.Count()) // from Metrics
}

Intégration ou héritage

Go ne possède pas d'héritage de classes. L'intégration relève de la composition :

  • L'intégration expose les champs et les méthodes, mais le type englobant n'est pas un sous-type
  • Vous ne pouvez pas transmettre un Dog lorsqu'un Animal est attendu
  • Utilisez les interfaces pour le polymorphisme et l'intégration pour réutiliser le code

Masquage des méthodes exposées

La structure englobante peut masquer une méthode intégrée en définissant sa propre méthode :

package main
import "fmt"

type Base struct{}
func (Base) Hello() string { return "Base hello" }

type Child struct{ Base }
func (Child) Hello() string { return "Child hello" } // shadows Base.Hello

func main() {
    c := Child{}
    fmt.Println(c.Hello())      // Child hello
    fmt.Println(c.Base.Hello()) // Base hello (explicit)
}

Structure anonyme pour la configuration

Utilisez une structure anonyme pour regrouper une configuration associée sans définir de type nommé :

package main
import "fmt"

func main() {
    cfg := struct {
        Host string
        Port int
        TLS  bool
    }{
        Host: "api.example.com",
        Port: 443,
        TLS:  true,
    }
    fmt.Println(cfg)
}

Intégrer une interface

L'intégration d'une interface dans une structure est utile pour les simulations et les implémentations par défaut :

package main
import "fmt"

type Reader interface{ Read() string }

type Mock struct{ Reader }  // embed interface

func main() {
    m := Mock{}
    fmt.Printf("%T\n", m.Reader) // <nil> — not set
    // Assign a real impl at test time:
    _ = m
}

Pièges de la composition de structures

Faites attention aux points suivants :

  • Sélecteurs ambigus lorsque deux types intégrés ont le même nom de champ ou de méthode
  • Un pointeur intégré nul peut provoquer une panique lorsque vous appelez ses méthodes
  • N'oubliez pas que l'intégration n'est pas un héritage : vous ne pouvez pas substituer le type englobant au type intégré

Comparer des structures anonymes

Deux structures anonymes ayant les mêmes noms et types de champs peuvent être affectées l'une à l'autre si leurs étiquettes correspondent également :

package main
import "fmt"

func main() {
    a := struct{ X, Y int }{1, 2}
    b := struct{ X, Y int }{1, 2}
    fmt.Println(a == b) // true
}

Vérification rapide

Quel est l'effet de l'intégration d'un type dans une structure ?

Récapitulatif : composition

À retenir :

  • Les structures anonymes conviennent parfaitement aux tests pilotés par tableau et aux données de courte durée
  • L'intégration expose les champs et les méthodes : il s'agit de composition, et non d'héritage
  • Les types englobants peuvent masquer les méthodes intégrées
  • Résolvez explicitement les sélecteurs ambigus
  • Utilisez les interfaces pour le polymorphisme

Exercice pratique

Créez une structure TimestampedRecord qui intègre un Timestamp struct{ CreatedAt, UpdatedAt string } et un Data struct{ Key, Value string }. Instanciez-la et affichez tous les champs exposés.

Questions Fréquemment Posées

La leçon « Structs anonymes et composition » est-elle gratuite ?

Oui — le texte complet de « Structs anonymes et composition » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Structs anonymes et composition » ?

Intégration et réutilisation du code fondée sur les structs Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Structs anonymes et composition » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Définir et utiliser des structs
  2. Méthodes sur les structs
  3. Modèles de constructeurs
  4. Structs anonymes et composition
← Retour à Go Academy