Récapitulatif - Carnet de contacts
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 18 sur 107.
Défi
FacileConstruisons un système de carnet de contacts qui rassemble les types personnalisés, les structures imbriquées, les balises de structure (struct tags) et les valeurs par défaut (zero values)—tous les concepts que vous avez maîtrisés dans ce chapitre.
Vous organiserez votre code sur deux fichiers :
contact.go: Définissez votre modèle de données de carnet de contacts avec des types personnalisés significatifs et un formatage JSON approprié :- Créez des types personnalisés
PhoneetEmailbasés surstringpour rendre votre code auto-documenté - Définissez une structure
Addressavec les champsStreet,CityetCountry, chacun avec les balises JSON appropriées - Définissez une structure
ContactcontenantName(string),Phone(votre type Phone),Email(votre type Email) etAddress(structure imbriquée). Utilisez des balises JSON oùphoneetemaildoivent être omis s'ils sont vides
- Créez des types personnalisés
main.go: Lisez les informations de contact depuis l'entrée, créez une instance de Contact et affichez-la sous forme de JSON formaté. Certains contacts peuvent avoir des informations incomplètes—laissez les valeurs par défaut etomitemptygérer cela avec élégance.
Les entrées suivantes seront fournies :
- Ligne 1 : Nom du contact
- Ligne 2 : Numéro de téléphone (peut être vide)
- Ligne 3 : Adresse e-mail (peut être vide)
- Ligne 4 : Rue
- Ligne 5 : Ville
- Ligne 6 : Pays
Utilisez json.MarshalIndent avec deux espaces pour l'indentation. Affichez la chaîne JSON résultante.
Par exemple, si l'on donne un contact avec le nom Alice Smith, pas de téléphone, l'e-mail alice@example.com, la rue 123 Main St, la ville Boston et le pays USA, votre sortie devrait ressembler à ceci :
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}Remarquez comment le champ phone n'apparaît pas du tout puisqu'il était vide—c'est votre balise omitempty à l'œuvre !
Essayez vous-même
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Lire le nom
scanner.Scan()
name := scanner.Text()
// Lire le téléphone (peut être vide)
scanner.Scan()
phone := scanner.Text()
// Lire l'e-mail (peut être vide)
scanner.Scan()
email := scanner.Text()
// Lire la rue
scanner.Scan()
street := scanner.Text()
// Lire la ville
scanner.Scan()
city := scanner.Text()
// Lire le pays
scanner.Scan()
country := scanner.Text()
// TODO: Créer une instance de Contact en utilisant les valeurs d'entrée
// Utilisez vos types personnalisés Phone et Email pour les champs respectifs
// Créez la structure Address imbriquée avec street, city, et country
// TODO: Utiliser json.MarshalIndent pour convertir le contact en JSON
// Utiliser "" comme préfixe et " " (deux espaces) comme indentation
// TODO: Imprimer la chaîne JSON
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et Modules GoPackages et ImportsNoms exportés vs non exportésIntroduction à la POO en GoLes Structs comme ClassesDéfinir des méthodes sur les StructsReceveurs par pointeur vs par valeurInitialisation de StructsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL'interface comme contratInterface vide (any)Assertion de typeType SwitchComposition d'interfacesInterfaces Stringer & ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter & SetterMasquage d'informations en GoRécapitulatif - Dossiers étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesContournement pour les méthodes génériquesRécapitulatif - Collections génériques13Patrons de conception, Partie 1
Introduction aux Design PatternsPatron SingletonPatron FactoryPatron Abstract FactoryPatron ObserverPatron Strategy2Exploration approfondie des Types et Structs
Types de base et compositesDéfinitions de types personnalisésTags de StructStructs anonymesStructs imbriquéesValeurs par défaut et Zero ValuesRécapitulatif - Carnet de contacts5Composition plutôt qu'héritage
Pourquoi Go n'a pas d'héritageLes bases de l'imbrication de structsPromotion de méthodesImbriquer plusieurs structsImbrication vs AgrégationMasquage de méthodes imbriquéesRécapitulatif - Hiérarchie des employés8Gestion des erreurs & POO
L'interface errorTypes d'erreurs personnalisésError Wrapping (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - File Parser11Bibliothèque standard et POO
io.Reader & io.WriterL'interface sort.InterfaceL'interface fmt.Stringerencoding/json avec les StructsL'interface http.HandlerRécapitulatif - Modèles d'API REST14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeMiddleware en tant que Décorateur3Pointeurs et Mémoire
Bases des pointeurs en GoPointeurs vers des structsPassage par valeur vs référenceLa fonction new()Garbage Collection en GoRécapitulatif - Constructeur de liste chaînée6Le polymorphisme en Go
Le polymorphisme via les interfacesLe Duck Typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif - Processeur de paiement9Concurrence et POO
Bases des GoroutinesChannels et CommunicationChannels avec buffer vs sans bufferL'instruction Selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures Thread-SafeRécapitulatif - Worker Pool