Maison > développement back-end > Golang > Go Generics peut-il créer un canal pour divers types d'exécution ?

Go Generics peut-il créer un canal pour divers types d'exécution ?

Mary-Kate Olsen
Libérer: 2024-12-10 06:46:14
original
249 Les gens l'ont consulté

Can Go Generics Create a Channel for Diverse Runtime Types?

Go Generic Container pour divers types d'exécution

Énoncé du problème :

Comment créer un Canal Go pouvant accueillir n'importe quel type de données à l'aide de génériques, permettant à une goroutine de traiter des données de différents types sans spécifier le type au préalable.

Solution :

L'approche proposée utilisant des génériques est incorrecte. Les génériques nécessitent une instanciation avec un type spécifique avant utilisation. Au lieu de cela, pour un canal pouvant gérer n'importe quel type, un canal de type chan interface{} doit être créé.

Explication détaillée :

Les génériques dans Go permettent la définition de types paramétrés, comme un canal pouvant contenir un type particulier. Cependant, tenter de créer un canal pouvant accepter n'importe quel type sans spécifier un type concret (comme dans le canal T) n'est pas réalisable.

Pour qu'un canal puisse être utilisé pour envoyer et recevoir des données, son type doit être spécifié. . Par exemple :

type GenericChan[T any] chan T
Copier après la connexion

Pour utiliser ce canal générique, il doit être instancié avec un type concret :

c := make(GenericChan[int])
Copier après la connexion

Approche incorrecte utilisant des génériques :

Le code fourni dans la question tente de créer un canal générique pouvant contenir n'importe quel type, tel que as :

func StartController[T any](sender chan Packet[T]) {
    go runThread(sender)
}
Copier après la connexion

Cependant, cela est incorrect car le type de canal n'est pas défini. La compilation du code donne :

.\test.go:8:22: cannot use generic type Packet[T interface{}] without instantiation
Copier après la connexion

Approche correcte en utilisant l'interface chan{} :

Au lieu d'utiliser des génériques, un canal de type chan interface{} devrait être créé :

sender := make(chan interface{})
Copier après la connexion

Cette chaîne peut accepter des données de tout type et est compatible avec diverses goroutines. Lors de la réception de données de ce canal, le récepteur doit utiliser l'assertion de type pour déterminer le type de données réel :

data := <-sender
fmt.Println(data.(int)) // Type assertion to retrieve the int value
Copier après la connexion

Alternative utilisant des génériques et des paramètres de type :

Alors qu'un Un canal générique capable de gérer n'importe quel type n'est pas possible, il est possible d'écrire du code générique qui consomme des types arbitraires et maintient la sécurité des types. Ceci peut être réalisé en utilisant des paramètres de type :

func receiveAny[T any](c chan T) T {
    return <-c
}
Copier après la connexion

Cette fonction peut être appelée avec un chan int ou une chaîne chan, tout en conservant la sécurité du type.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal