Maison >développement back-end >Golang >Pourquoi les listes liées génériques ne peuvent-elles pas être utilisées comme clés de carte dans Go (avant la version 1.20) ?

Pourquoi les listes liées génériques ne peuvent-elles pas être utilisées comme clés de carte dans Go (avant la version 1.20) ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-18 12:50:13958parcourir

Why Can't Generic Linked Lists Be Used as Map Keys in Go (Prior to 1.20)?

Go Generics : contraintes de type pour les clés de carte

Question :

Pourquoi les éléments suivants le code ne parvient pas à se compiler lors de l'utilisation d'une liste chaînée générique comme carte clé ?

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

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

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

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

Réponse :

Dans Go 1.18 et 1.19, la contrainte comparable prédéfinie est requise pour les clés de carte et limite son utilisation à des types strictement comparables qui prend en charge les comparaisons == et != sans paniquer au moment de l'exécution. Les interfaces, même si elles prennent en charge les comparaisons d'égalité, n'implémentent pas de comparable car elles ont un ensemble de types infini.

Bien que l'interface List[X] elle-même puisse être utilisée comme clé de mappage, la structure Cons[X] le fait n'implémente pas comparable car il contient un champ List[X]. Il n'existe pas de contrainte plus faible pouvant être utilisée pour identifier les types pouvant être utilisés comme clés de carte.

Cependant, dans Go 1.20 (février 2023), ce comportement a été corrigé. comparable accepte désormais tous les types comparables selon la spécification du langage, même s'ils peuvent paniquer au moment de l'exécution à cause de la comparaison. Cela permet au code de se compiler avec succès.

Contrainte alternative :

S'il est nécessaire d'utiliser une contrainte qui inclut la méthode isList(), vous pouvez définir la vôtre contrainte comme suit :

type List interface {
    comparable
    isList() bool
}

Ensuite, demandez à vos structures de clé de carte d'implémenter cette interface List au lieu de déclarer une interface champ.

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