Verstehen der Verwendung von Adressrückgabe in Go-Konstruktoren: Neue vs. direkte Rückgabe
Im Gegensatz zu anderen Sprachen, die explizite Konstruktoren bereitstellen, verwendet Go a „Neue“ Funktion anstelle von Konstruktoren. Warum ist es jedoch üblich, die Adresse (&f) in der Funktion „Neu“ von Go zurückzugeben, anstatt das Dateiobjekt direkt zurückzugeben?
Unterschiede zwischen Adresse und direkten Rückgaben
Die Syntax von Go ermöglicht die Rückgabe von Werten (Nicht-Zeigern) oder Zeigern, wobei die Entscheidung dem Entwickler überlassen bleibt. Normalerweise wird ein Zeiger zurückgegeben, wenn der Wert als eins nützlicher ist. Dies ist insbesondere dann der Fall, wenn der zurückgegebene Wert:
1. Verfügt über mehrere Methoden mit Zeigerempfängern:
Die Rückgabe eines Zeigers ermöglicht die Verkettung von Methodenaufrufen direkt auf dem zurückgegebenen Objekt, auch wenn die Methoden einen Zeigerempfänger benötigen. Dadurch entfällt die Notwendigkeit, den zurückgegebenen Wert in einer Variablen zu speichern und die Methoden manuell aufzurufen.
2. Wird in nicht adressierbaren Datenstrukturen gespeichert:
Einige Datenstrukturen, wie z. B. Karten, unterstützen keine direkte Adressierung von Werten. Die Rückgabe eines Zeigers umgeht diese Einschränkung und ermöglicht Methodenaufrufe für den in der Datenstruktur gespeicherten Wert.
3. Wird eine große Struktur häufig weitergegeben:
Zeiger sind für große Strukturen, die häufig weitergegeben werden, von Vorteil, da sie die Speichernutzung und Leistung optimieren.
Beispielvergleich:
Betrachten Sie eine einfache Struktur mit einer Methode, die einen Zeiger akzeptiert Empfänger:
type My int func (m *My) Str() string { return strconv.Itoa(int(*m)) } func createMy(i int) My { return My(i) } // Direct return func createMyPtr(i int) *My { return (*My)(&i) } // Address return
Beim Versuch, den direkten Rückgabewert zu verwenden:
fmt.Println(createMy(12).Str())
Es tritt ein Fehler auf: „Zeigermethode kann auf createMy(12) nicht aufgerufen werden“. Allerdings mit der Adressenrückgabe:
fmt.Println(createMyPtr(12).Str())
Der Methodenaufruf gelingt ohne Fehler.
Fazit:
Die Entscheidung, ob a zurückgegeben werden soll Zeiger oder Wert direkt in Gos „Neu“-Funktion basiert auf der beabsichtigten Verwendung des zurückgegebenen Objekts. Zeiger bieten Vorteile beim Umgang mit Methoden mit Zeigerempfängern, nicht adressierbaren Datenstrukturen oder großen Strukturen, die häufig weitergegeben werden.
Das obige ist der detaillierte Inhalt vonWarum in der „neuen' Funktion von Go einen Zeiger anstelle eines Werts zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!