Maison >développement back-end >Golang >Comment convertir une tranche d'un type d'interface en un autre en Go ?
Conversion de type de tranches contenant différentes interfaces
Dans Go, il est possible de rencontrer un scénario où vous devez passer une tranche d'une interface à une fonction qui attend une tranche d’une interface compatible différente. Prenons l'exemple suivant :
<code class="go">type A interface { Close() error Read(b []byte) (int, error) } type B interface { Close() error } type Impl struct {} // Implementation of interface A and B func (I Impl) Close() error {...} func (I Impl) Read(b []byte) (int, error) {...}</code>
Compatibilité des interfaces
Dans cet exemple, l'interface A inclut l'interface B, c'est-à-dire que chaque type qui implémente A implémente également B. Comme par conséquent, une implémentation concrète de A, telle que Impl, satisfait à la fois A et B.
Transmission de valeurs individuelles
Si nous essayons de transmettre des éléments individuels entre fonctions, cela fonctionne comme prévu :
<code class="go">im := &Impl{} single(im) // works</code>
Passer des tranches
Cependant, lorsque nous essayons de passer des tranches, nous rencontrons une erreur :
<code class="go">list := []A{t} slice(list) // FAILS!</code>
L'erreur est : impossible d'utiliser la liste (type []A) comme type []io.Reader en argument pour slice
Solution
Pour résoudre ce problème, nous pouvons créer manuellement une nouvelle tranche du type d'interface souhaité :
<code class="go">ioReaders := make([]io.Reader, len(list)) for i, v := range list { ioReaders[i] = v } slice(ioReaders) // now works</code>
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!