Maison  >  Article  >  développement back-end  >  Confus par la suggestion du guide officiel Go d'utiliser le même type de récepteur pour toutes les méthodes

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

PHPz
PHPzavant
2024-02-10 10:42:08689parcourir

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer