Maison développement back-end Golang Comment hériter à Golang

Comment hériter à Golang

May 22, 2023 pm 03:25 PM

Dans le langage Go, il n'y a pas de « classe » telle que définie dans les langages orientés objet traditionnels, il n'y a donc pas de soi-disant « héritage ». Cependant, le langage Go fournit une méthode permettant d'obtenir un héritage similaire via la composition, appelée Embedding.

L'intégration nous permet d'incorporer un type dans un autre type, afin que le type intégré puisse accéder directement aux propriétés et méthodes du type dans lequel il est intégré sans avoir à y accéder via une interface ou d'autres moyens. Ce processus est similaire au « héritage » traditionnel, mais plus flexible.

Ci-dessous, nous utiliserons plusieurs exemples pour montrer comment utiliser l'intégration pour obtenir une fonctionnalité de type héritage.

  1. Exemple de base

Nous définissons d'abord quelques structures de base, chiens, chats et personnes :

type Dog struct {
    name string
}

func (d Dog) Bark() {
    fmt.Println(d.name, ": 汪汪汪!")
}

type Cat struct {
    name string
}

func (c Cat) Mew() {
    fmt.Println(c.name, ": 喵喵喵!")
}

type Person struct {
    name string
}

func (p Person) Speak() {
    fmt.Println(p.name, ": 你好!")
}
Copier après la connexion

Maintenant, nous voulons créer un type d'animal, qui peut "hériter" des chiens et des chats, et qui possède également ses propres propriétés et méthodes, telles que la couleur et la vitesse de course. On peut le définir ainsi :

type Animal struct {
    Dog
    Cat
    color       string
    runSpeed    int
}

func (a Animal) Run() {
    fmt.Println(a.color, "的动物以", a.runSpeed, "km/h的速度奔跑!")
}
Copier après la connexion

Dans cette définition, le type Animal embarque les types Chien et Chat. Cela signifie que les objets instanciés de type Animal peuvent accéder directement aux propriétés et méthodes de types Chien et Chat. Nous pouvons également définir nos propres propriétés et méthodes pour le type Animal, telles que color et runSpeed, pour représenter la couleur et la vitesse de course de l'animal, et définir une méthode Run pour décrire l'action de course de l'animal.

Créons maintenant un objet Animal et voyons comment il fonctionne :

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    a.Bark()    // 小黑 : 汪汪汪!
    a.Mew()     // 小白 : 喵喵喵!
    a.Run()     // 黑白相间 的动物以 50 km/h的速度奔跑!
}
Copier après la connexion

Nous pouvons voir qu'en intégrant les types Dog et Cat, l'objet Animal peut appeler directement les méthodes Bark et Mew sans utiliser d'interfaces ou d'autres moyens. Cette approche nous permet d'obtenir des fonctionnalités similaires sans utiliser « l'héritage » au sens traditionnel.

  1. Incorporation de types personnalisés

Nous pouvons intégrer un type personnalisé dans un autre type personnalisé pour obtenir un effet similaire à l'héritage. Maintenant, définissons un type Personne et un type Étudiant, et intégrons le type Personne dans le type Étudiant :

type Person struct {
    name string
    age  int
    sex  string
}

type Student struct {
    Person
    class string
    score float64
}
Copier après la connexion

Dans cette définition, le type Étudiant intègre le type Personne. Lors de l'instanciation d'un objet de type Student, vous pouvez utiliser les propriétés et méthodes de Person. Par exemple, nous pouvons instancier un objet étudiant et définir son nom, son âge, son sexe, sa classe et ses notes :

func main() {
    s := Student{
        Person: Person{
            name: "小明",
            age:  18,
            sex:  "男",
        },
        class: "高三一班",
        score: 92.5,
    }
    fmt.Println("姓名:", s.name)
    fmt.Println("年龄:", s.age)
    fmt.Println("性别:", s.sex)
    fmt.Println("班级:", s.class)
    fmt.Println("成绩:", s.score)
}
Copier après la connexion

Lorsque nous exécutons ce programme, nous pouvons voir le résultat comme suit :

姓名: 小明
年龄: 18
性别: 男
班级: 高三一班
成绩: 92.5
Copier après la connexion

Nous pouvons voir que l'objet Student peut Accédez directement aux propriétés et méthodes des objets de type Personne, y compris les attributs tels que le nom, l'âge et le sexe.

  1. Intégration imbriquée

Il est également possible d'imbriquer plusieurs types dans un seul type. Nous pouvons intégrer le type Animal dans un autre type pour obtenir plus de fonctions. Par exemple, définissons maintenant un type Zoo :

type Zoo struct {
    Animal
    name    string
    address string
}

func (z Zoo) ShowInfo() {
    fmt.Println("这是", z.name, ", 地址是", z.address)
    z.Run()
}
Copier après la connexion

Dans la définition de ce type, nous intégrons le type Animal dans le type Zoo. De cette manière, le type Zoo peut accéder directement aux propriétés et méthodes du type Animal, y compris la méthode Run. Nous définissons une autre méthode ShowInfo pour afficher le nom et l'adresse du zoo, et appelons la méthode Run de type Animal pour afficher les animaux en train de courir.

Maintenant, nous créons un objet Zoo et testons ses méthodes :

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    z := Zoo{a, "北京动物园", "北京市海淀区清华科技园路"}
    z.ShowInfo()
}
Copier après la connexion

Lorsque nous exécutons ce programme, nous pouvons voir le résultat comme suit :

这是 北京动物园 , 地址是 北京市海淀区清华科技园路
黑白相间 的动物以 50 km/h的速度奔跑!
Copier après la connexion

Nous pouvons voir qu'en imbriquant le type Animal dans le type Zoo, nous pouvons créez un type avec plus de fonctions, qui peut afficher les informations du zoo et les actions en cours des animaux.

Résumé

Bien qu'il n'y ait pas de concepts de classes et d'héritage définis par les langages orientés objet traditionnels dans le langage Go, le concept d'intégration nous permet d'obtenir des fonctions similaires sans utiliser les méthodes d'héritage traditionnelles, ce qui le rend plus flexible et plus pratique. À travers les exemples ci-dessus, nous pouvons voir que l'intégration facilite la création d'un type contenant des sous-types et l'appel pratique de leurs méthodes et propriétés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

Cet article explique les mécanismes d'importation des packages de Go: les importations nommées (par exemple, importation & quot; fmt & quot;) et les importations vierges (par exemple, importation _ & quot; fmt & quot;). Les importations nommées rendent le contenu du package accessible, tandis que les importations vierges ne font que l'exécuter t

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Cet article détaille la conversion efficace de la requête MySQL Resulte en tranches de structure GO. Il met l'accent sur l'utilisation de la méthode de numérisation de la base de données / SQL pour des performances optimales, en évitant l'analyse manuelle. Meilleures pratiques pour la cartographie des champs struct à l'aide de balises DB et de robus

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Cet article explique la fonction Newflash () de Beego pour le transfert de données inter-pages dans les applications Web. Il se concentre sur l'utilisation de NewFlash () pour afficher les messages temporaires (succès, erreur, avertissement) entre les contrôleurs, en tirant parti du mécanisme de session. Limiter

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Cet article montre la création de simulations et de talons dans GO pour les tests unitaires. Il met l'accent sur l'utilisation des interfaces, fournit des exemples d'implémentations simulées et discute des meilleures pratiques telles que la tenue de simulations concentrées et l'utilisation de bibliothèques d'assertion. L'articl

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Cet article explore les contraintes de type personnalisé de Go pour les génériques. Il détaille comment les interfaces définissent les exigences de type minimum pour les fonctions génériques, améliorant la sécurité du type et la réutilisabilité du code. L'article discute également des limitations et des meilleures pratiques

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Cet article détaille la rédaction de fichiers efficace dans GO, en comparant OS.WriteFile (adapté aux petits fichiers) avec OS.OpenFile et Buffered Writes (optimal pour les fichiers volumineux). Il met l'accent sur la gestion robuste des erreurs, l'utilisation de différer et la vérification des erreurs spécifiques.

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Cet article explore l'utilisation d'outils de traçage pour analyser le flux d'exécution des applications GO. Il traite des techniques d'instrumentation manuelles et automatiques, de comparaison d'outils comme Jaeger, Zipkin et OpenTelelemetry, et mettant en évidence une visualisation efficace des données

See all articles