Avatar ·

Warum braucht man in Go die Funktionen make() und new() und was ist der Unterschied?

Hallo zusammen! Ich habe gerade angefangen, Go zu lernen und bin bei zwei eingebauten Funktionen verwirrt — make() und new(). In der Dokumentation steht, dass beide Speicher allozieren, aber ich verstehe nicht, wann ich welche verwenden soll.

Hier ist ein einfaches Beispiel, das mich verwirrt. Ich möchte eine map und einen slice erstellen:

// Variante 1: mit new()
m := new(map[string]int)
s := new([]int)

// Variante 2: mit make()
m2 := make(map[string]int)
s2 := make([]int, 5)

Die erste Variante kompiliert, aber beim Versuch, einen Wert in die map einzufügen mit m["key"] = 1 bekomme ich eine panic: assignment to entry in nil map. Beim slice gibt es auch ein Problem — s[0] = 10 schlägt mit nil pointer fehl. Die zweite Variante funktioniert dagegen einwandfrei.

Wo liegt hier der Haken? Warum gibt new()?