Die Funktion make in Go wird ausschließlich zur Initialisierung von Objekten der Typen: slice, map und channel verwendet. Sie allokiert die benötigte Datenstruktur und gibt ein einsatzbereites Objekt zurück (kein Zeiger!).
Beispiele:
s := make([]int, 5, 10) // Slice mit Länge 5 und Kapazität 10 m := make(map[string]int) // leere Map ch := make(chan int, 2) // gepufferter Kanal mit 2
Details:
slice sind die Parameter: Länge (len) und (optional) Kapazität (cap).map und chan — nur (optionale) Kapazität (anfängliche Größe/Puffer).make gibt bereits ein initialisiertes Objekt zurück, das bereit zur Verwendung ist.make nicht verwendet, sie werden mit Literalen oder new initialisiert (das einen Zeiger auf den Nullwert zurückgibt).Vergleich mit new:
new(T) gibt *T zurück, wobei alle Felder null sind.make(T) gibt T nur für drei Typen zurück: slice, map, chan.Kann man eine funktionierende Map durch new anstelle von make erhalten?
m := new(map[string]int) (*m)["a"] = 1 // Was passiert?
Viele glauben, dass dies korrekt ist, aber es tritt zur Laufzeit ein Panic auf: assignment to entry in nil map. Denn in der Variable *m befindet sich nil!
Korrekt: Verwenden Sie make:
m := make(map[string]int) m["a"] = 1 // OK
Geschichte
In einem Mikrodienst zur Speicherung von Cache wurde eine Map über var cache map[string]interface{} ohne Initialisierung mit make erstellt, was bei der Speicherung zu Panic in der Produktion mit unverständlichem Stacktrace führte. Das Problem wurde erst nach der Codeanalyse gefunden: die Map war nil.
Geschichte
Bei der Erstellung einer Datenpipeline wurde der Puffer des Kanals vergessen und es wurden make(chan int) verwendet. Infolgedessen blieben die Goroutinen hängen, während sie auf das Lesen warteten, obwohl ein asynchroner Austausch erwartet wurde. Der Fehler wurde erst bei einem Belastungstest bemerkt.
Geschichte
In einem Projekt, wo die Initialisierung über new erfolgte, versuchten einige Entwickler, new([]int) anstelle von make([]int, 10) zu verwenden, was dazu führte, dass sie einen Zeiger auf ein nil-Slice erhielten und zur Laufzeit Panic bei den ersten Schreibversuchen auftraten.