• [^] # Re: Trou de mémoire

    Posté par . En réponse au lien Go 1.18 Beta : la généricité enfin !. Évalué à 3.

    Hum l'article propose ça:

    // function
    func buildCompleteList(process func(opts *github.ListOptions)(*github.Response, error)) (*github.Response, error) {
     var response *github.Response
     var err error
     ops := &github.ListOptions{}
     for {
     response, err = process(opts)
     if err != nil || response.NextPage == 0 {
     break
     }
     opts.Page = response.NextPage
     }
     return response, err
    }
    // slot d'appel
    var teams []*github.Team
    resp, err := buildCompleteList(func(opts *github.ListOptions) (*github.Response, error) {
     newTeams, response, err := client.Organizations.ListTeams(org, opts)
     teams = append(teams, newTeams...)
     return response, err
    })

    et à vu de nez la version générique serait ça:

    // function
    func buildCompleteList[T](build func(opts *github.ListOptions)(*T, *github.Response, error)) ([]*T, error) {
     var list []*T
     var err error
     ops := &github.ListOptions{}
     for {
     items, response, e := process(opts)
     if e != nil || response.NextPage == 0 {
     err = e
     break
     }
     list = append(list, items...)
     opts.Page = response.NextPage
     }
     return list, err
    }
    // slot d'appel
    teams, err := buildCompleteList(func(opts *github.ListOptions) (*github.Response, error) {
     return client.Organizations.ListTeams(org, opts)
    })

    Et du coup je dirais :

    • la version closure fait le append avec ou sans l'erreur pas sûr que ce soit toujours une bonne idée
    • le slot d'appel est bien plus simple en générique (je ne serait pas surpris qu'il existe du sucre syntaxique pour ce genre de chose), la complexité ajouté dans la méthode générique ne me semble pas insurmontable
    • tu as moins de bruit avec la première variable retournée par la méthode non générique dont on ne sait pas trop quoi faire. La méthode générique a un usage plus courant avec un retour de la forme (réponse attendue, erreur)

    Après ça n'est qu'une manière de faire, tu peux préférer avoir un itérateur qui va te permettre de t'arrêter là où tu souhaite (ou de commencer à faire des choses avant de tout charger et utiliser une coroutine pour ça va poser des questions de backpressure).

    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll