Maison >développement back-end >Golang >Fonctions génériques acceptant les canaux et les tranches
J'essaie d'écrire une fonction générique en golang qui recherchera les valeurs dans les tranches et les canaux de la même manière. Voici un exemple :
// minof returns the smallest number found among the channel / slice contents func minof[t chan int | []int](input t) (result int) { for _, value := range input { if result > value { result = value } } return }
Mais j'obtiens l'erreur de compilation suivante : cannot range over input(类型 t 的变量受 chan int|[]int 约束)(t 没有核心类型)
.
J'ai essayé de créer une interface générique comme celle-ci :
type Rangable interface { chan int | []int } // MinOf returns the smallest number found among the channel / slice contents func MinOf[T Rangable](input T) (result int) { for _, value := range input { if result > value { result = value } } return }
Bien que l'erreur ait été modifiée en cannot range over input(t 类型的变量受 rangable 约束)(t 没有核心类型)
, elle reste fondamentalement la même...
Existe-t-il un moyen de résoudre cette tâche en utilisant des génériques ou des canaux et la tranche ne peut pas être « convertie » vers le même type de noyau ?
Merci pour toutes suggestions et idées !
Vous ne pouvez pas faire ça.
range
L'expression doit commencer par un type de base. Les unions avec des termes de types différents n'ont pas de type de base car il n'y a pas de type sous-jacent commun.
Vous pouvez également comprendre intuitivement pourquoi range
nécessite un type de noyau : la sémantique des tranches et des plages de canaux est différente.
Ranger sur un canal peut être une opération de blocage, s'étendre sur une tranche ne l'est pas
Les variables d'itération sont différentes
for i, item := range someslice {}
Pour les tranches, i
是 int
类型的索引,item
est le type de l'élément slice.
for item := range somechan {}
Pour les chaînes, item
est le type de l'élément chan, et c'est la seule variable de plage possible.
Le mieux que vous puissiez avoir est un interrupteur de type :
func MinOf[T any, U chan T | []T](input U) (result int) { switch t := any(input).(type) { case chan T: // range over chan case []T: // range over slice } return }
Mais encore une fois, le comportement de cette fonction (bloquant ou non bloquant) dépend du type, et on ne sait pas quel avantage vous pouvez gagner en utilisant des génériques ici.
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!