Structs anonymes
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 15 sur 107.
Une struct anonyme est une struct sans type nommé. Vous définissez sa structure et créez une instance en une seule étape, sans utiliser le mot-clé type.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Cela crée une valeur de struct directement sans déclarer de type réutilisable. Les structs anonymes sont utiles lorsque vous avez besoin d'une structure de données rapide et ponctuelle qui ne sera pas utilisée ailleurs dans votre code.
Un cas d'utilisation courant est de regrouper des données liées pour une seule fonction ou un seul test.
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostLes structures anonymes sont également populaires dans les tests pilotés par des tableaux où chaque cas de test possède des champs uniques.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}Comme les structs anonymes n'ont pas de nom de type, vous ne pouvez pas définir de méthodes sur celles-ci ni réutiliser le type ailleurs. Utilisez-les pour un regroupement de données temporaire et localisé. Pour tout ce que vous référencerez plusieurs fois, définissez plutôt un type struct nommé.
Défi
FacileConstruisons un système de configuration rapide qui démontre quand les structures anonymes brillent — pour un regroupement de données ponctuel qui n'a pas besoin d'un type réutilisable.
Vous organiserez votre code sur deux fichiers :
config.go: Créez une fonction appeléeGetServerConfigqui prend un nom de serveur (string), un port (int) et un mode de débogage (bool) comme paramètres. Cette fonction doit retourner une structure anonyme contenant ces trois valeurs comme champs :Name,PortetDebug. Comme cette configuration n'est utilisée qu'à un seul endroit, il n'est pas nécessaire de définir un type nommé pour celle-ci.main.go: Lisez les valeurs de configuration du serveur à partir de l'entrée, appelez votre fonctionGetServerConfiget affichez les détails de la configuration.
Les entrées suivantes seront fournies :
- Ligne 1 : Nom du serveur
- Ligne 2 : Numéro de port
- Ligne 3 : Mode débogage (
trueoufalse)
Format de sortie :
Server: [Name]
Port: [Port]
Debug: [Debug]Par exemple, avec api-server, 8080 et true, votre sortie devrait être :
Server: api-server
Port: 8080
Debug: trueRemarquez comment la structure anonyme vous permet de retourner des données groupées sans encombrer votre base de code avec un type qui n'est utilisé qu'une seule fois.
Aide-mémoire
Une structure anonyme (anonymous struct) est une structure sans type nommé, définie et instanciée en une seule étape sans utiliser le mot-clé type :
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Les structures anonymes sont utiles pour les structures de données ponctuelles qui ne seront pas réutilisées ailleurs dans votre code.
Les cas d'utilisation courants incluent le regroupement de données liées pour une seule fonction :
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostEt les tests pilotés par les données (table-driven tests) :
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}Les structures anonymes ne peuvent pas avoir de méthodes définies sur elles ni être réutilisées en tant que type. Utilisez-les pour un regroupement de données temporaire et localisé. Pour les types référencés plusieurs fois, définissez plutôt une structure nommée.
Les fonctions peuvent retourner des structures anonymes :
func GetConfig() struct {
Name string
Port int
} {
return struct {
Name string
Port int
}{
Name: "server",
Port: 8080,
}
}Essayez vous-même
package main
import (
"fmt"
)
func main() {
// Lire les valeurs d'entrée
var name string
var port int
var debug bool
fmt.Scanln(&name)
fmt.Scanln(&port)
fmt.Scanln(&debug)
// TODO: Appeler GetServerConfig avec les valeurs d'entrée
// et stocker la structure anonyme retournée
// TODO: Imprimer la configuration dans le format requis :
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
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
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