Aller au contenu principal

Types génériques

Créer un type générique​

En go il est possible de créer des types génériques avec le mot clé interface. Ces types génériques définissent une liste de types qui peuvent être utilisés avec ce type générique.

Grâce à ces types génériques, il est possible de créer des fonctions qui peuvent être utilisées avec plusieurs types différents.

Exemple :

// On définit un type générique qui peut être utilisé avec les types int et float64
type IntOrFloat interface {
int | float64
}

Utiliser un type générique avec une fonction​

Pour utiliser un type générique avec une fonction, il faut définir le type générique dans la fonction. Pour cela on utilsera un tableau sous cette forme : [T Generic] où T est le nom du type générique et Generic est le type générique que l'on placera avant les paramètres de la fonction.

// Création d'une fonction générique
func printValue[T IntOrFloat](value T) {
fmt.Println(value)
}

func main() {
// On appelle la fonction printValue avec un int
var a int = 1
printValue(a) // -> 1

// On appelle la fonction printValue avec un float64
var b float64 = 1.5
printValue(b) // -> 1.5

}

Il est également possible de définir les types directement dans la fonction :

func printValue[T int | float64](value T) {
fmt.Println(value)
}

// OU

func printValue[T interface{int | float64}](value T) {
fmt.Println(value)
}

Cependant si l'on définit un type personnalité, l'appel de la fonction renverra une erreur :

func main() {
type f float64
var a f = 1.5

printValue(a) // -> f does not satisfy int | float64 (possibly missing ~ for float64 in int | float64)
}

Pour remédier à cela, il faut utiliser le symbole ~ devant le type personnalisé dans la définition du type générique :

func printValue[T int | ~float64](value T) {
fmt.Println(value)
}

Grâce à cela, tous les types qui implément le type float64 pourront être utilisés avec la fonction printValue.