Heim >Backend-Entwicklung >Golang >Wie übergebe ich einen Ausschnitt einer Schnittstelle an eine Funktion und erwarte in Go einen Ausschnitt einer anderen, kompatiblen Schnittstelle?

Wie übergebe ich einen Ausschnitt einer Schnittstelle an eine Funktion und erwarte in Go einen Ausschnitt einer anderen, kompatiblen Schnittstelle?

Susan Sarandon
Susan SarandonOriginal
2024-10-24 20:53:17559Durchsuche

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

Übergabe eines Schnittstellensegments an eine andere kompatible Schnittstelle in Go

Bei der Arbeit mit Schnittstellen in Go kann es vorkommen, dass Sie auf Situationen stoßen, in denen Sie dies benötigen um ein Segment einer Schnittstelle an eine Funktion zu übergeben, die ein Segment einer anderen Schnittstelle erwartet, obwohl die erste Schnittstelle die zweite enthält.

Betrachten Sie das folgende Beispiel:

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

Während der Übergabe an Einzelnes Element vom Typ A an die Funktion single mit einem Schnittstellenparameter io.Reader ist erfolgreich, der Versuch, ein Segment von A an das Funktions-Slice zu übergeben, das ein Segment von io.Reader erwartet, schlägt fehl.

Lösung:

Leider handelt es sich bei diesem Problem um eine Einschränkung in Go. Um dies zu umgehen, müssen Sie ein neues Slice des gewünschten Schnittstellentyps erstellen und es mit Elementen aus dem vorhandenen Slice füllen.

<code class="go">newList := make([]io.Reader, len(list))
for i, elem := range list {
    newList[i] = elem
}

slice(newList) // now works</code>

Das obige ist der detaillierte Inhalt vonWie übergebe ich einen Ausschnitt einer Schnittstelle an eine Funktion und erwarte in Go einen Ausschnitt einer anderen, kompatiblen Schnittstelle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn