Maison  >  Article  >  développement back-end  >  Comment transmettre une tranche d'une interface à une fonction en attendant une tranche d'une interface différente et compatible dans Go ?

Comment transmettre une tranche d'une interface à une fonction en attendant une tranche d'une interface différente et compatible dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-24 20:53:17457parcourir

How to Pass a Slice of One Interface to a Function Expecting a Slice of a Different, Compatible Interface in Go?

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!

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