Heim > Backend-Entwicklung > Golang > Go-Speicherzuweisung: Wann sollte ich „new()' vs. „&' verwenden?

Go-Speicherzuweisung: Wann sollte ich „new()' vs. „&' verwenden?

Barbara Streisand
Freigeben: 2024-12-27 15:15:12
Original
354 Leute haben es durchsucht

Go Memory Allocation: When Should I Use `new()` vs. `&`?

Über die Zuweisung hinaus: Erkundung der Unterschiede zwischen new() und regulärer Zuweisung

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.

new() vs. Regular Allocation: Ein genauerer Blick

Auf den ersten Blick sind die Codeschnipsel Das, was Sie zur Verfügung gestellt haben, mag scheinen nicht unterscheidbar:

v := &Vector{}
Nach dem Login kopieren

versus

v := new(Vector)
Nach dem Login kopieren

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))
}
Nach dem Login kopieren

Ausgabe:

*main.Vector
*main.Vector
Nach dem Login kopieren

Wie gezeigt, geben beide Methoden Zeiger auf Instanzen der Vector-Struktur zurück.

Die Verwirrungsrätsel

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)

Bemerkenswerte Unterschiede: An Ausnahme

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}
Nach dem Login kopieren

In diesem Szenario ist new() die einzige Methode, die die Erstellung eines Zeigers auf einen unbenannten Integer-Typ ermöglicht.

Fazit

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!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage