Maison >développement back-end >Golang >Go Generics peut-il créer un canal pour divers types d'exécution ?
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!