Maison > développement back-end > Golang > Fonctions génériques acceptant les canaux et les tranches

Fonctions génériques acceptant les canaux et les tranches

PHPz
Libérer: 2024-02-06 08:36:10
avant
818 Les gens l'ont consulté

Fonctions génériques acceptant les canaux et les tranches

Contenu de la question

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
}
Copier après la connexion

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
}
Copier après la connexion

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 !


Bonne réponse


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.

  1. Ranger sur un canal peut être une opération de blocage, s'étendre sur une tranche ne l'est pas

  2. Les variables d'itération sont différentes

for i, item := range someslice {}
Copier après la connexion

Pour les tranches, iint 类型的索引,item est le type de l'élément slice.

for item := range somechan {}
Copier après la connexion

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
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal