Verwirrt durch den Vorschlag im offiziellen Go-Leitfaden, für alle Methoden denselben Empfängertyp zu verwenden

PHPz
Freigeben: 2024-02-10 10:42:08
nach vorne
689 Leute haben es durchsucht

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

php-Editor Baicao ist verwirrt über den Vorschlag im offiziellen Go-Leitfaden, für alle Methoden denselben Empfängertyp zu verwenden. Beim Erlernen der Go-Sprache stoßen wir häufig auf den Vorschlag, dass der Empfängertyp bei der Definition der Methode konsistent sein sollte. Allerdings wirft dieser Vorschlag in der praktischen Anwendung einige Fragen auf. Um die Bedeutung und den Zweck dieses Vorschlags besser zu verstehen, werden wir ihn eingehend untersuchen und versuchen, eine vernünftige Erklärung zu finden.

Frageninhalt

Ich versuche zu lernen. Gehen Sie das offizielle Go-Tutorial durch und ich fand den letzten Teil des Abschnitts über Wert- und Zeigerempfänger verwirrend:

Im Allgemeinen sollten alle Methoden eines bestimmten Typs entweder einen Wertempfänger oder einen Zeigerempfänger haben, jedoch nicht beides. (Wir werden auf den nächsten Seiten herausfinden, warum.)

Grundsätzlich habe ich zwei Fragen:

A) Ich kann anscheinend keinen Grund finden, warum wir die beiden Empfängertypen für den Rest dieses Kapitels nicht mischen sollten. Wenn also jemand den Abschnitt erklären oder zitieren könnte, in dem dies besprochen wird, wäre ich dankbar.

B) Angenommen, dass das Mischen von Zeigern und Wertempfängern tatsächlich eine schlechte Idee ist, wie implementiert man verschiedene Schnittstellen? Ich habe zum Beispiel herausgefunden, dass dieses Tutorial zwei verschiedene integrierte Schnittstellen beschreibt, die Stringererror。在为 Stringer 提供的代码中,使用了值接收器,并且切换到指针接收器似乎不起作用,而在 error-Schnittstelle, in der Zeigerempfänger verwendet werden. Wie kann ich diese beiden Schnittstellen für eine Struktur implementieren, ohne die oben genannten Prinzipien zu verletzen?

Bitte beachten Sie, dass ich mich mit ähnlichen Fragen zu den Nachteilen der Verwendung von Wertempfängern gegenüber Zeigerempfängern (z. B. Objekterstellung) und der Wichtigkeit der Aufrechterhaltung der Konsistenz (aus dieser Frage) befasst habe, aber da ich ein echter Anfänger bei Scholars For Go bin, habe ich Ich habe gerade versucht, diese mit Informationen/Beispielen aus der offiziellen Go-Tour zu kombinieren.

Danke!

Workaround

Für das erste Problem kann es zu einem subtilen Wettlauf kommen, wenn sowohl ein Wertempfänger als auch ein Zeigerempfänger vorhanden sind, da Wertempfänger das Objekt kopieren. Zum Beispiel:

type T struct {
  field int
}

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

func (t *T) SetField(i int) {t.field=i}
Nach dem Login kopieren

Wenn Sie im obigen Beispiel beide aufrufen SetFieldValueReceiver,则您将进行一场竞赛。这是因为,当 SetField 写入字段时,ValueReceiver, wird eine Kopie des Empfängers erstellt, wodurch dasselbe Feld ohne explizite Synchronisierung gelesen wird.

Zur zweiten Frage: Wenn Sie alle Schnittstellen von T 的方法,那么让所有方法都使用指针接收器是有意义的。这样您就可以防止微妙的竞争,并实现 T geändert haben.

Hier ist ein Link zu den FAQ zu diesem Thema (danke an @jub0bs):

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

Dieses Beispiel basiert auf dem folgenden Beitrag:

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

Das obige ist der detaillierte Inhalt vonVerwirrt durch den Vorschlag im offiziellen Go-Leitfaden, für alle Methoden denselben Empfängertyp zu verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!