Maison  >  Article  >  développement back-end  >  Pourquoi mon champ Go Struct est-il rétabli après un appel de méthode ?

Pourquoi mon champ Go Struct est-il rétabli après un appel de méthode ?

DDD
DDDoriginal
2024-11-15 05:48:02301parcourir

Why Does My Go Struct Field Revert After a Method Call?

Réversion du champ de structure

Dans le code Go fourni, un comportement étrange est observé lorsqu'un champ de structure change au sein d'une méthode mais revient à son valeur d'origine lors d'une vérification ultérieure. Ce problème vient du fait que la structure est passée par valeur au lieu de par pointeur.

Explication :

Dans la méthode sendMessage de la structure TVManager, une méthode sendCommand d'une structure connecteur est appelée avec une valeur du TVManager structurer. Lorsqu'une structure est passée par valeur, une copie de la structure est créée et transmise à la place d'une référence à la structure d'origine.

Dans la méthode sendCommand de la structure MockConnector, les champs de la structure du connecteur (par exemple, last_command, value) est modifiée. Cependant, comme le connecteur est passé par valeur, les modifications ne sont appliquées qu'à la copie de la structure, pas à celle d'origine.

Pour résoudre ce problème, la structure du connecteur dans le La méthode sendCommand doit être passée par pointeur au lieu de par valeur. Cela permet à la méthode de modifier la structure du connecteur d'origine, plutôt qu'une copie.

Solution :

Remplacer :

func (this MockConnector) sendCommand(payload map[string]string)

Par :

func (this *MockConnector) sendCommand(payload map[string]string)

Supplémentaire Considérations :

  • Il est généralement déconseillé d'utiliser "this" comme nom de récepteur dans Go.
  • Si une méthode d'un type donné nécessite un récepteur de pointeur, il est préférable d'utiliser des récepteurs de pointeur pour toutes méthodes de cela tapez.

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