Maison >développement back-end >Golang >La contrainte « comparable » de Go Generics peut-elle être assouplie pour les clés de carte ?

La contrainte « comparable » de Go Generics peut-elle être assouplie pour les clés de carte ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-18 12:38:22662parcourir

Can Go Generics' `comparable` Constraint Be Relaxed for Map Keys?

Go génériques : contrainte de type pour les clés de carte ?

Dans Go 1.18 et versions antérieures, la contrainte comparable prédéclarée est requise pour les types utilisés comme clés de carte. Cette contrainte garantit que le type prend en charge les opérateurs == et != et ne panique pas lorsque ces opérateurs sont utilisés.

Cependant, cette contrainte n'est pas toujours appropriée pour les types pouvant être utilisés comme clés de mappage. Par exemple, le code suivant définit une liste chaînée générique :

type List[X any] interface {
    isList()
}

type Cons[X any] struct {
    Data X
    Next List[X]
}

func (Cons[X]) isList() {}

type Nil[X any] struct{}

func (Nil[X]) isList() {}

Ce code définit une interface List qui est implémentée par deux types : Cons et Nil. Le type Cons représente une liste non vide, tandis que le type Nil représente une liste vide.

Le code suivant utilise l'interface List pour créer un mappage de listes en chaînes :

type List[X any] interface {
    isList()
}

func main() {
    x := Cons[int]{5, Nil[int]{}}
    m := map[List[int]]string{}
    m[x] = "Hi"        // succeeds
    fmt.Println(m[x])  // prints "Hi"
}

Ce code sera compilé et exécuté avec succès. Cependant, si nous essayons d'utiliser une méthode sur le type Cons, nous obtiendrons une erreur du compilateur :

type List[X any] interface {
    isList()
}

func main() {
    x := Cons[int]{5, Nil[int]{}}
    fmt.Println(id(x)) // error: Cons[int] does not implement comparable
}

Le message d'erreur indique que le type Cons[int] n'implémente pas la contrainte comparable. En effet, le type Cons a un champ de type List[int] et l'interface List[int] n'implémente pas la contrainte comparable.

Une solution possible à ce problème consiste à utiliser une contrainte de type plus faible. Par exemple, nous pourrions utiliser la contrainte suivante :

type List[X any] interface {
    isList()
    Comparable() bool
}

Cette contrainte nous permettrait d'utiliser le type Cons comme clé de mappage, même si elle n'implémente pas la contrainte comparable.

Go 1.20 (février 2023)

La contrainte comparable est la contrainte fourre-tout correcte pour les clés de carte. Tous les types comparables selon la spécification Go, même si la comparaison peut paniquer au moment de l'exécution, peuvent satisfaire la contrainte comparable. Votre code sera compilé comme prévu dans la version 1.20.

Cela corrige enfin l'incohérence de la version précédente de Go concernant les types comparables aux spécifications par rapport aux types comparables.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn