Heim >Backend-Entwicklung >Golang >Wie übergebe ich einen Ausschnitt einer Schnittstelle an eine Funktion und erwarte in Go einen Ausschnitt einer anderen, kompatiblen Schnittstelle?
Ü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!