Maison > développement back-end > Golang > Comment les récepteurs de pointeurs peuvent-ils résoudre les problèmes de mise en œuvre de l'interface Go lors de la modification des valeurs d'instance sous-jacentes ?

Comment les récepteurs de pointeurs peuvent-ils résoudre les problèmes de mise en œuvre de l'interface Go lors de la modification des valeurs d'instance sous-jacentes ?

Susan Sarandon
Libérer: 2024-12-15 08:44:13
original
679 Les gens l'ont consulté

How Can Pointer Receivers Solve Go Interface Implementation Issues When Modifying Underlying Instance Values?

Récepteurs de pointeur pour les interfaces dans Go

Lors de l'utilisation de récepteurs de méthode dans Go, un récepteur de type pointeur permet à la méthode de modifier le réel valeur d'instance du récepteur. Dans le code donné, nous avons l'interface IFace avec deux méthodes, GetSomeField et SetSomeField. La structure d'implémentation implémente IFace et possède des méthodes avec des récepteurs de valeurs, ce qui signifie qu'elles opèrent sur une copie de l'instance.

Pour améliorer le comportement, nous devons modifier le récepteur de méthode pour SetSomeField afin qu'il soit de type pointeur, de sorte que nous pouvons manipuler l'instance réelle. Cependant, cela conduit à une erreur de compilation où l'implémentation ne peut pas implémenter IFace car la méthode SetSomeField a un récepteur de pointeur.

La solution consiste à garantir que le pointeur vers la structure implémente l'interface. Ce faisant, nous pouvons modifier les champs de l'instance réelle sans créer de copie. Voici le code modifié :

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

Avec cette modification, nous activons le pointeur vers Implémentation pour implémenter IFace, nous permettant de modifier l'instance réelle sans créer de copie.

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