Passer une tranche d'interface à une autre interface compatible dans Go
Lorsque vous travaillez avec des interfaces dans Go, vous pouvez rencontrer des situations où vous avez besoin pour passer une tranche d'une interface à une fonction qui attend une tranche d'une interface différente, malgré que la première interface inclut la seconde.
Considérons l'exemple suivant :
<code class="go">type A interface { Close() error Read(b []byte) (int, error) } type Impl struct {} func (I Impl) Read(b []byte) (int, error) { fmt.Println("In read!") return 10, nil } func (I Impl) Close() error { fmt.Println("I am here!") return nil } func single(r io.Reader) { fmt.Println("in single") } func slice(r []io.Reader) { fmt.Println("in slice") } im := &Impl{} single(im) // works list := []A{im} slice(list) // fails: cannot use list (type []A) as type []io.Reader</code>
En passant une élément individuel de type A à la fonction single avec un paramètre d'interface io.Reader réussit, en essayant de transmettre une tranche de A à la tranche de fonction en attendant une tranche de io.Reader échoue.
Résolution :
Malheureusement, ce problème est une limitation de Go. Pour contourner ce problème, vous devez créer une nouvelle tranche du type d'interface souhaité et la remplir avec des éléments de la tranche existante.
<code class="go">newList := make([]io.Reader, len(list)) for i, elem := range list { newList[i] = elem } slice(newList) // 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!