Maison > développement back-end > Golang > Pourquoi mon champ Struct s'inverse-t-il de manière inattendue lors de Go ?

Pourquoi mon champ Struct s'inverse-t-il de manière inattendue lors de Go ?

Susan Sarandon
Libérer: 2024-11-17 07:15:03
original
229 Les gens l'ont consulté

Why Does My Struct Field Revert Unexpectedly in Go?

Le champ de structure revient de manière inattendue

Dans Go, les structures sont transmises par valeur, ce qui signifie que les modifications apportées à une structure au sein d'une fonction ne sont pas reflétées dans la structure d'origine. Cela devient évident dans le code fourni, où un champ de structure revient à sa valeur d'origine même si la valeur a apparemment été modifiée au sein d'une méthode.

Le problème réside dans la façon dont la structure est transmise à la méthode. Dans le code donné, la méthode TVManager sendMessage() modifie une copie du champ du connecteur, et toutes les modifications apportées à l'intérieur de la méthode ne sont pas propagées à la structure d'origine.

Pour résoudre ce problème, la méthode doit utiliser un récepteur pointeur. En préfixant le récepteur avec un astérisque (*), la méthode recevra un pointeur vers l'instance de structure réelle et toutes les modifications apportées au sein de la méthode seront appliquées à la structure d'origine.

func (this *TVManager) sendMessage(message string) {
    fmt.Println("5", this.connector)
    payload := map[string]string{
        "id":    "0",
        "type":  "request",
        "uri":   "ssap://system.notifications/createToast",
        "payload": "{'message': 'This is a message'}",
    }
    this.connector.sendCommand(payload)
    fmt.Println("4", this.connector)
}
Copier après la connexion

De même, dans le objet simulé, la méthode sendCommand() doit également utiliser un récepteur de pointeur.

func (this *MockConnector) sendCommand(payload map[string]string) {
    fmt.Println("0", this)
    this.last_command = payload
    this.value = true
    fmt.Println("0", this)
}
Copier après la connexion

Une autre convention Go consiste à éviter d'utiliser "this" ou "self" comme récepteur noms. Au lieu de cela, il est recommandé d'utiliser un nom concis et descriptif qui correspond à la fonctionnalité de la méthode.

En implémentant ces modifications, le champ struct sera mis à jour avec succès sans revenir à sa valeur d'origine.

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
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