Maison > développement back-end > Golang > Comment puis-je modifier le champ d'une structure via une méthode d'interface à l'aide de récepteurs de pointeurs dans Go ?

Comment puis-je modifier le champ d'une structure via une méthode d'interface à l'aide de récepteurs de pointeurs dans Go ?

Barbara Streisand
Libérer: 2024-12-12 11:56:18
original
351 Les gens l'ont consulté

How Can I Modify a Struct's Field via an Interface Method Using Pointer Receivers in Go?

Récepteur de pointeur pour les méthodes Golang

En Golang, un récepteur fait référence à un objet responsable de la gestion des appels de méthode. Selon le type de récepteur, il peut être divisé en récepteur de valeur et récepteur de pointeur.

Dans l'exemple donné, le récepteur de la méthode SetSomeField est un récepteur de valeur, ce qui signifie que la méthode opère sur une copie de la variable créée lors de l'appel de la méthode. Cela a pour conséquence que la méthode est incapable de modifier l'instance réelle mais met uniquement à jour la copie, ce qui entraîne un comportement inattendu.

Afin de résoudre ce problème, le récepteur de la méthode SetSomeField doit être remplacé par un récepteur pointeur. Les récepteurs de pointeurs permettent aux méthodes de modifier l'instance réelle car ils accèdent directement à l'adresse mémoire de l'instance.

Cependant, cela va créer un nouveau problème : la structure n'implémente plus l'interface. En effet, l'interface nécessite que la méthode SetSomeField soit définie comme récepteur de valeur et les récepteurs de pointeurs ne sont pas compatibles.

La solution est de créer une fonction Create qui renvoie un type de récepteur de pointeur puis d'attribuer ce pointeur à une variable qui implémente l'interface. Cela permet aux méthodes de modifier l'instance réelle tout en restant conforme à la définition de l'interface :

package main

import (
    "fmt"
)

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}
Copier après la connexion

En utilisant un récepteur de pointeur, la méthode SetSomeField peut modifier l'instance réelle tout en implémentant l'interface. Cela garantit que la méthode modifie l'état de l'objet comme prévu.

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