Structs et interfaces

Go Struct Embedding and Composition

Go has no inheritance. Reuse fields and methods by embedding one struct in another.

  • Intermédiaire
  • 4 min de lecture
  • 1 exemple exécutable
Ce que vous allez apprendre
  • Embedding a struct
  • Promoted fields and methods
  • Composition
type Dog struct
  • Dog
    • AnimalName, Describe()
    • Breed

Build types from smaller types

Go has no inheritance. Instead, a struct can embed another struct, and the fields and methods of the embedded type become available on the outer one. This is called composition.

Dog embeds Animal, so dog.Name and dog.Describe() work as if they were declared on Dog. The embedded value can still be reached by its type name, as in dog.Animal.Name. Service gets a Log method by embedding Logger.

Points clés

  1. Dog embeds Animal and gets Name and Describe.
  2. The embedded value is still reachable: dog.Animal.
  3. Embedding is composition, not inheritance.

Exemple Go exécutable

Go
Exécuter le code →
main.go
package main

import "fmt"

type Animal struct {
	Name string
}

func (a Animal) Describe() string {
	return a.Name + " is an animal"
}

type Dog struct {
	Animal // embedded: Dog gets Name and Describe
	Breed  string
}

func (d Dog) Speak() string {
	return d.Name + " says woof"
}

type Logger struct{ Prefix string }

func (l Logger) Log(message string) { fmt.Println(l.Prefix + message) }

type Service struct {
	Logger
	Name string
}

func main() {
	dog := Dog{Animal: Animal{Name: "Rex"}, Breed: "Collie"}
	fmt.Println(dog.Describe())
	fmt.Println(dog.Speak())
	fmt.Println(dog.Animal.Name, dog.Breed)

	service := Service{Logger: Logger{Prefix: "[api] "}, Name: "users"}
	service.Log("started " + service.Name)
}
Obtenir un bouton Run pour cet exemple Résultat de l'exécution
Rex is an animal
Rex says woof
Rex Collie
[api] started users

S'entraîner

Ouvrez l'exemple dans le compilateur en ligne, modifiez une valeur ou ajoutez une ligne, et devinez la sortie avant de l'exécuter. Cassez ensuite le code exprès et lisez le message du compilateur.

Leçon terminée ?

Marquez-la comme apprise pour suivre votre progression.

Suivante : Temperature Converter →

S'entraîner avec un défi

Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.

Tous les défis