Supposons que je veuille écrire un type list
générique qui contient des méthodes utiles telles que :
type list[t any] []t func (l *list[t]) len() int func (l *list[t]) get(pos int) (t t, err error) func (l *list[t]) set(pos int, t t) error func (l *list[t]) append(t ...t) func (l *list[t]) insert(t t, pos int) error func (l *list[t]) remove(pos int) (t t, err error) // etc...
Cependant, il existe d'autres méthodes utiles qui peuvent nécessiter de restreindre davantage le type d'élément de la listet
. Par exemple, nous ne pouvons pas implémenter la méthode contains
sur ce t
。例如,我们无法在此 list
类型上实现 contains
type :
func (l *list[t]) contains(t t) bool { for _, s := range *l { if s == t { // compiler error: invalid operation: s == t (incomparable types in type set) return true } } return false }
Si nous déclarons list
为,我们只能实现 contains
as, nous ne pouvons implémenter que contient
type List[T comparable] []T
Mais cela rend impossible la création de types incomparables list
.
Existe-t-il un moyen d'obtenir le meilleur des deux mondes ? C'est-à-dire existe-t-il une méthode t
的 list[t]
,但在 t
具有可比性的情况下允许它有一个 contains
disponible pour les types incomparables ?
J'ai pensé à :
liste incomparable
/uncomparablelist
/list
或 list
/comparablelist
ou liste comparable
) 包含
Créer Mais je n’aime vraiment aucun d’entre eux.
Je pense qu'un moyen raisonnable de résoudre ce problème est de passer un comparateur explicite :
func (l *list[t]) contains(t t, cmp func(t, t) bool) bool { for _, s := range *l { if cmp(s, t) { return true } } return false }
func main() { list := list[int]([]int{1,2,3}) fmt.println(list.contains(2, func(a, b int) bool { return a == b })) // true }
func eq[t comparable](a, b t) bool { return a == b }
func main() { list := List[int]([]int{1,2,3}) fmt.Println(list.Contains(2, Eq[int]) // true }
list
类型中嵌入一个比较器,并为其指定默认值 func(a, b t) bool { return false }
Vous pouvez également intégrer un comparateur dans le type et lui donner une valeur par défaut func(a, b t) bool { return false }
et exposer un comparateur personnalisé qui peut lui être transmis Constructeur. Mais cela est peut-être trop obscur pour vous. 🎜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!