Avatar ·

Pourquoi les fonctions make() et new() sont nécessaires en Go et quelle est leur différence ?

Bonjour à tous ! Je viens de commencer à apprendre Go et je suis confus au sujet de deux fonctions intégrées — make() et new(). Dans la documentation, il est dit que les deux allouent de la mémoire, mais je ne comprends pas quand utiliser laquelle.

Voici un exemple simple qui me trouble. Je veux créer une map et un slice :

// Option 1 : avec new()
m := new(map[string]int)
s := new([]int)

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

La première option se compile, mais quand j'essaie d'ajouter une valeur à la map avec m["clé"] = 1, j'obtiens une panic : assignment to entry in nil map. Avec le slice, c'est pareil — s[0] = 10 échoue avec nil pointer. Alors que la deuxième option fonctionne parfaitement.

Où est la magie ? Pourquoi new() ne fonctionne-t-il pas pour map et slice ? J'ai lu que new() retourne un pointeur, tandis que make() non, mais cela n'explique pas pourquoi l'un fonctionne et l'autre pas. Expliquez-moi, s'il vous plaît, pour un débutant.