In Go ist die Speicherverwaltung von größter Bedeutung und die Zuweisung von Speicher über die Funktion new() oder das kaufmännische Und (&) hat Debatten über Effizienz und Präzision angeheizt. Dieser Artikel befasst sich mit den Nuancen dieser beiden Zuordnungsmethoden und untersucht ihre Ähnlichkeiten und möglichen Unterschiede.
Auf den ersten Blick sind die Codeschnipsel Das, was Sie zur Verfügung gestellt haben, mag scheinen nicht unterscheidbar:
v := &Vector{}
versus
v := new(Vector)
Bei näherer Betrachtung zeigt sich jedoch, dass sie eine Gemeinsamkeit haben: Der zurückgegebene Wert ist in beiden Fällen ein Zeiger auf eine neue Instanz der Vector-Struktur. Dies wird aus dem folgenden Codebeispiel deutlich:
package main import "fmt" import "reflect" type Vector struct { x int y int } func main() { v := &Vector{} x := new(Vector) fmt.Println(reflect.TypeOf(v)) fmt.Println(reflect.TypeOf(x)) }
Ausgabe:
*main.Vector *main.Vector
Wie gezeigt, geben beide Methoden Zeiger auf Instanzen der Vector-Struktur zurück.
Die Existenz sowohl von new() als auch von regulärer Zuordnung hat in der Go-Community für Verwirrung gesorgt. Einige argumentieren, dass es unnötig sei, beide Optionen zu haben, was möglicherweise zu Missverständnissen führen könne. Diese Debatte war weit verbreitet auf der Go-Mailingliste:
[https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs](https://groups.google .com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs)
Während allgemeiner Konsens darin besteht, dass new() und reguläre Zuweisung zu ähnlichen Ergebnissen führen, gibt es eine bemerkenswerte Ausnahme. Wenn Sie mit unbenannten Integer-Typen oder anderen Basistypen arbeiten, ist new() die einzige Option zum Erhalten eines Zeigers. Der folgende Code demonstriert dies:
p := new(int) // Error: cannot take the address of the type int p := &int{0}
In diesem Szenario ist new() die einzige Methode, die die Erstellung eines Zeigers auf einen unbenannten Integer-Typ ermöglicht.
Obwohl es hinsichtlich des zurückgegebenen Werts keinen signifikanten Unterschied zwischen new() und regulärer Zuweisung gibt, kann ihr Vorhandensein zu Verwirrung führen. Beachten Sie jedoch, dass new() beim Umgang mit Zeigern auf unbenannte Ganzzahlen oder Basistypen unbedingt erforderlich ist, um deren Verwendung zu klären und potenzielle Fallstricke zu vermeiden. Durch das Verständnis der Feinheiten der Speicherverwaltungstechniken in Go können Entwickler ihren Code im Hinblick auf Effizienz und Klarheit optimieren.
Das obige ist der detaillierte Inhalt vonGo-Speicherzuweisung: Wann sollte ich „new()' vs. „&' verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!