Maison > développement back-end > Golang > le corps du texte

Confus par la suggestion du guide officiel Go d'utiliser le même type de récepteur pour toutes les méthodes

PHPz
Libérer: 2024-02-10 10:42:08
avant
690 Les gens l'ont consulté

对 Go 官方指南中关于所有方法使用相同类型接收器的建议感到困惑

l'éditeur php Baicao est confus par la suggestion du guide officiel Go d'utiliser le même type de récepteur pour toutes les méthodes. Dans le processus d'apprentissage du langage Go, nous rencontrons souvent la suggestion selon laquelle le type de récepteur doit être cohérent lorsque la méthode est définie. Cependant, cette suggestion soulève certaines questions quant à son application pratique. Pour mieux comprendre le sens et le but de cette suggestion, nous allons l’explorer en profondeur et tenter de trouver une explication raisonnable.

Contenu de la question

J'essaie d'apprendre Go à travers le tutoriel officiel Go et j'ai trouvé la dernière partie de la section sur les récepteurs valeur vs pointeur déroutante :

En général, toutes les méthodes sur un type donné doivent avoir soit un récepteur de valeur, soit un récepteur de pointeur, mais pas les deux. (Nous découvrirons pourquoi dans les prochaines pages.)

En gros, j'ai deux questions :

A) Je n'arrive pas à trouver une raison pour laquelle nous ne devrions pas mélanger les deux types de récepteurs pour le reste de ce chapitre, donc si quelqu'un pouvait expliquer ou citer la section où cela est discuté, je serais reconnaissant.

B) En supposant que mélanger des pointeurs et des récepteurs de valeurs est effectivement une mauvaise idée, comment implémenter différentes interfaces ? Par exemple, j'ai découvert que ce tutoriel décrit deux interfaces intégrées différentes, l'interface Stringererror。在为 Stringer 提供的代码中,使用了值接收器,并且切换到指针接收器似乎不起作用,而在 error, dans lesquelles les récepteurs de pointeurs sont utilisés. Comment puis-je implémenter ces deux interfaces pour une structure sans violer les principes ci-dessus.

Veuillez noter que j'ai examiné des questions similaires concernant les inconvénients de l'utilisation de récepteurs de valeur par rapport aux récepteurs de pointeurs (par exemple, la création d'objets) et l'importance de maintenir la cohérence (à partir de cette question), mais comme je suis un vrai débutant Scholars For Go, je J'ai juste essayé de les combiner avec des informations/exemples de la tournée officielle de Go.

Merci !

Solution de contournement

Pour le premier problème, avoir à la fois un récepteur de valeur et un récepteur de pointeur peut provoquer une course subtile, puisque les récepteurs de valeur copient l'objet. Par exemple :

type T struct {
  field int
}

func (T) ValueReceiver() int {return 1}

func (t *T) SetField(i int) {t.field=i}
Copier après la connexion

Dans l'exemple ci-dessus, si vous appelez les deux SetFieldValueReceiver,则您将进行一场竞赛。这是因为,当 SetField 写入字段时,ValueReceiver, une copie du récepteur est créée, provoquant la lecture du même champ sans aucune synchronisation explicite.

Pour la deuxième question : Si vous avez modifié toutes les interfaces de T 的方法,那么让所有方法都使用指针接收器是有意义的。这样您就可以防止微妙的竞争,并实现 T.

Voici un lien vers la FAQ sur ce sujet (merci @jub0bs) :

https://www.php.cn/link/bcc097feafe80f489ef54b0720ca059c

Cet exemple est basé sur le post suivant :

https://dave.cheney .net/2015/11/18/wednesday-pop-quiz-spot-the-race

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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!