Refactoring méthode pour faire partie d'une interface

0

La question

Je suis un ex python dev parfois aux prises avec la nature explicite de Go. J'essaie ici de refactoriser le code afin d'être en mesure de déplacer une méthode à partir d'une structure à faire partie d'une interface. Mais le processus semble bizarre pour moi, je tiens à confirmer que je ne fais pas quelque chose de mal.

J'ai les interfaces suivantes, la structure et les méthodes:

type Executing interface {
    Execute()
}

type MyExecuter struct {
     attribut1 string
}

//The function I wish to move
func (exe1 *MyExecuter) format() string {
    return fmt.sprintf ("formated : %s", exe1.attribut1) 
}


func (exe1 *MyExecuter) Execute() {
    //Executing
    fmt.Println(exe.format())
}



func GetExecuter () Executer{
    return MyExecuter{attribut1: "test"}
}

Donc, ici, j'ai une interface générique Exécuter, cette interface sera accessible par l'objet retourné par la GetExecuter méthode.

Maintenant, dans le cadre de la mise en œuvre de l'un de mes Exécuteur, je veux déplacer la méthode de mise en forme dans le cadre d'une interface.
Donc, je suis en train de faire le suivant:

type Formatting interface {
    format() string
}

type Formatter struct {}

func (formatter *Formatter) format(exe1 *MyExecuter) (string) {
    return fmt.sprintf ("formated : %s", exe1.attribut1)
}

J'ai donc créer une nouvelle interface, une nouvelle structure vide, et la mise à jour de ma fonction à prendre comme attribut de mon précédent de la structure.

Bien que cela semble fonctionner, il me semble que c'est un peu compliqué. Spécialement la partie où j'ai besoin d'ajouter une référence à mon premier objet en tant qu'attribut de la méthode. Suis-je en train de faire quelque chose de mal ici, ou est-ce la bonne manière?

go interface
2021-11-22 20:42:22
1

La meilleure réponse

3

Votre Executer la mise en œuvre implémente déjà l' Formatting interface:

type Executing interface {
    Execute()
}

type Formatting interface {
    format() string
}

func (exe1 MyExecuter) format() string {
    return fmt.sprintf ("formated : %s", exe1.attribut1) 
}


func (exe1 MyExecuter) Execute() {
    //Executing
    fmt.Println(exe.format())
}

v:=MyExecuter{}
// Here, v implements Executing and Formatting interfaces

Une chose à noter ici: Votre code montre pointeur de récepteurs. Cela signifie que les méthodes sont définies pour *MyExecutermais pas pour MyExecuter. Donc, vous avez à passer des pointeurs vers des struct exemple pour que cela fonctionne. Ou, comme je l'ai fait ci-dessus, utiliser la valeur des récepteurs de sorte que les méthodes sont définies pour les deux MyExecuter et *MyExecuter.

2021-11-22 20:47:20

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................