Golang struct-Initialisierung
Es ist eine einfache Struktur wie diese:
type Event struct {
Id int
Name string
}
Was ist der Unterschied zwischen diesen beiden Initialisierungs-Methoden?
e1 := Event{Id: 1, Name: "event 1"}
e2 := &Event{Id: 2, Name: "event 2"}
Jeder, warum sollte ich entweder diese Initialisierung Methoden?
Dank
- Diese Arten von Konstrukten sind ziemlich grundlegende Dinge zum Gehen und erklärt sehr gut in die Tour Gehen (tour.golang.org). Wie über das arbeiten Sie Ihren Weg durch die tour, die einmal mehr?
- Es ist subtil, die ist nicht klar, in der tour. Es gibt einen Unterschied in immer einen Zeiger vs-Instanz selbst, wenn die Initialisierung einer struct. Wann und warum sollte ich eine Möglichkeit VS die anderen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Methode
ist die Initialisierung der variable
e1
als einen Wert mit Typ -Event
. Die zweiteinitialisiert
e2
als Zeiger auf einen Wert vom TypEvent
Wie du sagtest in den Kommentaren, die Methoden definiert, die auf einen Wert von einem bestimmten Typ sind eine Teilmenge der Methoden-set definiert einen Zeiger auf einen Wert von diesem Typ. Dies bedeutet, dass wenn Sie eine Methodedann beide
e1
unde2
diese Methode aufrufen kann, aber wenn Sie hatte noch eine andere Methode, sagen:Danne1
ist nicht in der Lage zu verwenden, dieChangeName
Methode, währende2
ist.Diese (
e1
ist nicht in der Lage zu verwenden, dieChangeName
Methode, währende2
ist) nicht der Fall (obwohl es vielleicht an der Zeit zu schreiben, für diese Hilfe), Dank @DannyChen für das oben Holen und @GilbertNwaiwu für die Prüfung und Veröffentlichung in den Kommentaren unten.(Zu der Adresse Durchgestrichen oben im Abschnitt: Die Gruppe der Methoden definiert, die auf ein struct-Typ bestehen aus den definierten Methoden für die Art und Zeiger auf den Typ an.
Stattdessen Gehen nun automatisch dereferenziert das argument an eine Methode, so dass, wenn eine Methode einen Zeiger erhält, Gehen Sie ruft die Methode auf einen Zeiger auf die struct, und wenn die Methode erhält einen Wert, Gehen Sie ruft die Methode auf den Wert hingewiesen, dass durch Strukt. An dieser Stelle mein Versuch zu aktualisieren, diese Antwort fehlt etwas wichtiges in der Semantik also, wenn jemand möchte, um dies zu korrigieren oder zu klären, fühlen Sie sich frei, um einen Kommentar hinzuzufügen, verweisen auf eine umfassendere Antwort. Hier ist ein bisschen aus der go-Spielplatz illustrieren dieses Problem: https://play.golang.org/p/JcD0izXZGz.
Zu einem gewissen Grad ändern, wie Pointer und Werte, die als Argumente an Methoden definiert, die auf die Funktion wirkt sich auf einige Bereiche des Diskurses unter, aber ich lasse den rest ungeschnitten, es sei denn, jemand ermutigt mich, Sie zu aktualisieren, als es zu sein scheint, mehr oder weniger richtig in den Kontext der Allgemeinen Semantik von Sprachen, die pass-by-value vs. Zeiger.)
Als der Unterschied zwischen Pointer und Werte, dieses Beispiel ist exemplarisch als Indikatoren werden normalerweise verwendet in Gehen, zu erlauben, Sie mutieren, die Werte, die eine variable verweist (aber es gibt viele weitere Gründe könnte man Zeiger verwenden, wie gut! Obwohl bei typischer Nutzung, das ist normalerweise eine solide Annahme). Also, wenn Sie definiert
ChangeName
statt als:Diese Funktion wäre nicht sehr nützlich, wenn genannt, auf den Wert, der Empfänger, der die Werte (keine Zeiger) wird nicht verhindern, dass änderungen, die erfolgt sind, wenn Sie einer Funktion übergeben werden. Dies hat zu tun mit einem Bereich von design-Sprache wie Variablen zugewiesen werden und bestanden: Was ist der Unterschied zwischen der übergabe by reference vs. Wert übergeben?
Können Sie sehen, diese auf dieses Beispiel auf den Spielplatz Gehen: https://play.golang.org/p/j7yxvu3Fe6
Den Typ der
e1
istEvent
die Art dere2
ist*Event
. Die Initialisierung ist eigentlich das gleiche (mit composite-literal-syntax auch nicht sicher, ob dieser jargon ist zu Gehen, oder C# oder beide?) aber mite2
Sie mit der 'Adresse der operator'&
so gibt es einen Zeiger auf das Objekt, anstatt die Instanz selbst.func (e *Event) Test()
und versucht, das zu tune1.Test()
ich würde ein compiler-Fehler. Ich konnte tunep := &e1
tun, und dannep.Test()
oder man könnte vielleicht machen, dass inline-oder was auch immer, aber Sie würde haben, um die Zeiger in der Reihenfolge zu nennen, die definierte Methode mit einem Zeiger als Empfänger. Im Grunde, wenn das aufrufen von Methoden, gehen nicht massage oder zwingen, die Art für Sie. Es muss mit dem übereinstimmen, was in der Methodendefinition. Sie können konvertieren Sie Wert auf Zeiger oder Zeiger auf Wert ganz leicht obwohl.