Avatar ·

Pourquoi les fonctions make() et new() sont-elles nécessaires en Go ? Quelle est la différence ?

Bonjour à tous ! J'ai commencé à étudier Go récemment et je n'arrive pas à comprendre pourquoi deux fonctions distinctes sont nécessaires pour allouer de la mémoire : make() et new(). Apparemment, les deux créent des objets, mais les exemples de la documentation m'ont seulement embrouillé.

Voici ce que j'essaie de faire. Je veux créer un slice et y ajouter immédiatement des éléments :

package main

import "fmt"

func main() {
    // J'essaie de créer un slice avec new
    slice1 := new([]int)
    fmt.Println(slice1)  // Affiche : &[]
    // Mais comment ajouter un élément ? slice1 = append(slice1, 1) ne fonctionne pas
    // Erreur : first argument to append must be slice; have *[]int

    // J'essaie de créer un slice avec make
    slice2 := make([]int, 5)
    fmt.Println(slice2) // Affiche : [0 0 0 0 0]
    // Ça marche, mais pourquoi la longueur est-elle directement 5 ? Peut-on le faire sans longueur ?

    // Et avec une map, c'est la même histoire
    var m1 map[string]int
    // m1["key"] = 1 // panic: assignment to entry in nil map

    m2 := make(map[string]int)
}