Menu
Coddy logo textTech

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) // localhost

Les 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é.

challenge icon

Défi

Facile

Construisons 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ée GetServerConfig qui 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, Port et Debug. 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 fonction GetServerConfig et 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 (true ou false)

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: true

Remarquez 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) // localhost

Et 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]
}
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