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
Susan Sarandonoriginal
2024-11-17 07:15:03212parcourir

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

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

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