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
Mary-Kate Olsenoriginal
2024-12-10 06:46:14219parcourir

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

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

c := make(GenericChan[int])

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)
}

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

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{})

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

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
}

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!

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