Maison > développement back-end > Golang > Pourquoi les interfaces Go ne peuvent-elles pas prendre directement en charge les méthodes de définition, et comment cela peut-il être contourné ?

Pourquoi les interfaces Go ne peuvent-elles pas prendre directement en charge les méthodes de définition, et comment cela peut-il être contourné ?

Mary-Kate Olsen
Libérer: 2024-11-25 00:50:14
original
294 Les gens l'ont consulté

Why Can't Go Interfaces Directly Support Setter Methods, and How Can This Be Worked Around?

Polymorphisme en Go : un examen plus approfondi des méthodes d'interface et des récepteurs de pointeurs

En Go, le polymorphisme n'est pas pris en charge nativement, mais il peut être réalisé à l’aide d’interfaces. Cela introduit une question courante : pourquoi les méthodes setter ne sont-elles pas autorisées pour les interfaces ?

Comme le démontre le code fourni, lorsque la méthode setter est définie comme récepteur de valeur, les modifications apportées au sein de la fonction sont perdues à sa sortie. . La modification du récepteur en récepteur pointeur permet des modifications permanentes, mais cela génère une erreur de compilation.

Pour résoudre ce problème, Go propose une solution de contournement. Le code corrigé modifie le récepteur de la méthode setter pour être un pointeur. Cela permet à la fonction de modifier la structure de données sous-jacente et de conserver les modifications. Le code modifié utilise une interface, garantissant que la méthode du récepteur de pointeur est accessible via l'interface.

package main

import "fmt"

type MyInterfacer interface {
    Get() int
    Set(i int)
}

type MyStruct struct {
    data int
}

func (this *MyStruct) Get() int {
    return this.data
}

func (this *MyStruct) Set(i int) {
    this.data = i
}

func main() {
    s := &MyStruct{123}
    fmt.Println(s.Get())

    s.Set(456)
    fmt.Println(s.Get())

    var mi MyInterfacer = s
    mi.Set(789)
    fmt.Println(mi.Get())
}
Copier après la connexion

Bien qu'il ne s'agisse pas strictement d'un polymorphisme, il obtient effectivement un résultat similaire en utilisant des interfaces et des récepteurs de pointeurs. Le code peut être utilisé pour définir des propriétés via une interface, encapsulant proprement les données et les opérations.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal