Aller au contenu

La Généricité (Go Tour 3/4)

Ce n’est que tout récemment, avec la version 1.18, que Go propose le concept de généricité. Ça a pris beaucoup de temps, car les concepteurs de Go tenaient à maintenir la compatibilité avec la version 1.x de Go et ne voulaient pas sacrifier la performance pour permettre les génériques.

Paramètres de type

Les fonctions Go peuvent être écrites pour accepter plusieurs types en utilisant des paramètres de type (type parameter). Ces paramètres de type sont donnés entre crochets, avant les arguments de la fonction :

func Index[T comparable](s []T, x T) int

Cette déclaration de la fonction Index indique que s est un slice de n’importe quel type T qui satisfait à la contrainte comparable. L’argument x est aussi de ce même type T.

comparable est une contrainte intégrée à Go qui rend l’utilisation d’opérations telles que == ou != possibles.

Types génériques

En plus des fonctions génériques, Go permet de définir des types génériques :

type List[T any] struct {
    next *List[T]
    val  T
}

Les génériques sont récents en Go, et on commence à en voir dans les bibliothèques standard. Par exemple, le paquetage slices1 contient une fonction Reverse qui peut être utilisée sur des slices de n’importe quel type.

La fonction est définie comme suit :

func Reverse[S ~[]E, E any](s S)

S est un type dont le type sous-jacent est un slice de n’importe quel type E. E est un type quelconque.

On peut utiliser cette fonction comme suit :

package main

import (
    "fmt"
    "slices"
)

func main() {
    names := []string{"alice", "Bob", "VERA"}
    slices.Reverse(names)
    fmt.Println(names)
}

Pour plus d’informations sur la généricité en Go, voir le tutorial, le blog et le proposal.


  1. le paquetage slices est apparu dans la version 1.21 de Go.