Menu
Coddy logo textTech

Bases de l’inclusion de structs

Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy. Leçon 35 sur 107.

L’intégration de structures est le mécanisme de Go permettant d’inclure un type de structure dans un autre. Au lieu d’utiliser un nom de champ, vous spécifiez simplement le type, et Go rend accessibles les champs de la structure intégrée dans la structure externe.

Voici la syntaxe de base :

type Address struct {
    City    string
    Country string
}

type Person struct {
    Name string
    Address  // embarqué - pas de nom de champ
}

Lorsque vous intégrez Address dans Person, vous pouvez accéder directement aux champs intégrés sur la structure externe :

func main() {
    p := Person{
        Name: "Alice",
        Address: Address{
            City:    "London",
            Country: "UK",
        },
    }
    
    fmt.Println(p.City)     // London - accès direct
    fmt.Println(p.Country)  // UK - accès direct
    fmt.Println(p.Address.City)  // fonctionne aussi
}

Remarquez comment p.City fonctionne sans écrire explicitement p.Address.City. Go promeut automatiquement les champs de la structure intégrée, les rendant accessibles comme s’ils appartenaient à la structure externe. Vous pouvez toujours y accéder via le nom du type intégré si nécessaire.

Cela diffère des structures imbriquées ordinaires, dans lesquelles vous devez toujours utiliser le nom du champ pour accéder aux champs internes. L’intégration crée une API plus plate et plus pratique, tout en conservant le regroupement logique des données associées.

challenge icon

Défi

Facile

Construisons un système d'immatriculation de véhicules qui utilise l'intégration de structures pour créer un modèle de données clair et organisé. Vous séparerez les informations de contact des détails du véhicule tout en permettant un accès direct à tous les champs grâce à l'intégration.

Vous organiserez votre code sur deux fichiers :

  • vehicle.go : Créez deux structures qui fonctionnent ensemble grâce à l'intégration :
    • Une structure ContactInfo avec les champs OwnerName et Phone (tous deux de type chaîne)
    • Une structure Vehicle qui intègre ContactInfo (sans nom de champ) et ajoute ses propres champs Make, Model et Year
    Créez également une méthode appelée Summary sur Vehicle qui renvoie une chaîne formatée contenant toutes les informations sur le véhicule et le contact.
  • main.go : Lisez les informations du véhicule et du propriétaire depuis l'entrée, créez une instance de Vehicle avec un ContactInfo intégré, et montrez l'accès aux champs intégrés à la fois directement et via le nom du type intégré. Affichez le résumé du véhicule à la fin.

Les entrées suivantes seront fournies :

  • Ligne 1 : Nom du propriétaire
  • Ligne 2 : Numéro de téléphone
  • Ligne 3 : Marque du véhicule
  • Ligne 4 : Modèle du véhicule
  • Ligne 5 : Année (entier)

Votre méthode Summary doit renvoyer une chaîne dans ce format :

[Year] [Make] [Model] - Owner: [OwnerName], Phone: [Phone]

Dans votre fichier principal, montrez la promotion des champs en affichant :

  1. Le nom du propriétaire accédé directement sur le Vehicle (par exemple, v.OwnerName)
  2. Le téléphone accédé via le type intégré (par exemple, v.ContactInfo.Phone)
  3. Le résumé complet de votre méthode Summary

Par exemple, avec Alice Smith, 555-1234, Toyota, Camry et 2023, votre sortie doit être :

Alice Smith
555-1234
2023 Toyota Camry - Owner: Alice Smith, Phone: 555-1234

Remarquez que les deux modes d'accès fonctionnent : l'accès direct grâce à la promotion des champs et l'accès explicite via le nom du type intégré, ce qui vous offre une certaine flexibilité dans la manière de travailler avec les données intégrées.

Essayez vous-même

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Lire le nom du propriétaire
	ownerName, _ := reader.ReadString('\n')
	ownerName = strings.TrimSpace(ownerName)

	// Lire le numéro de téléphone
	phone, _ := reader.ReadString('\n')
	phone = strings.TrimSpace(phone)

	// Lire la marque du véhicule
	make, _ := reader.ReadString('\n')
	make = strings.TrimSpace(make)

	// Lire le modèle du véhicule
	model, _ := reader.ReadString('\n')
	model = strings.TrimSpace(model)

	// Lire l'année
	yearStr, _ := reader.ReadString('\n')
	yearStr = strings.TrimSpace(yearStr)
	year, _ := strconv.Atoi(yearStr)

	// TODO: Créer une instance de Vehicle avec ContactInfo embarqué
	// Utiliser les valeurs lues depuis l'entrée ci-dessus

	// TODO: Afficher le nom du propriétaire accessible directement sur le Vehicle (promotion de champ)
	// Exemple: fmt.Println(v.OwnerName)

	// TODO: Afficher le téléphone accessible via le nom du type embarqué
	// Exemple: fmt.Println(v.ContactInfo.Phone)

	// TODO: Afficher le résumé complet en utilisant la méthode Summary
	// Exemple : fmt.Println(v.Summary())

	// Supprimez ces lignes une fois que vous aurez implémenté la solution
	_ = ownerName
	_ = phone
	_ = make
	_ = model
	_ = year
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Go en ligne