Konvertieren von Schnittstellenabschnitten in kompatible Schnittstellenabschnitte
Die Implementierung verschiedener Schnittstellen, die überlappende Methoden enthalten, kann Flexibilität bei der Programmierung bieten. Allerdings kann die Übergabe eines Teils einer Schnittstelle an eine Funktion, die eine andere, aber kompatible Schnittstelle erwartet, zu Fehlern führen. Sehen wir uns an, wie wir dieses Problem in Go angehen können.
Angenommen, wir haben die Schnittstellen A und B, wobei A B einschließt. Eine Implementierung von A, Impl, erfüllt sowohl A als auch B.
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
}
Einzelne Elemente können problemlos über Funktionen hinweg übergeben werden. Der Versuch, Slices von A an Funktionen zu übergeben, die io.Reader erwarten, kann jedoch fehlschlagen.
func single(r io.Reader) {
fmt.Println("in single")
}
func slice(r []io.Reader) {
fmt.Println("in slice")
}
im := &Impl{}
// works
single(im)
// FAILS!
list := []A{t}
slice(list)
Um dieses Problem zu lösen, können wir ein neues Slice vom Typ []io.Reader erstellen und es mit Elementen aus []A füllen. Dies ist die Problemumgehung, um die Einschränkung zu umgehen und die Kompatibilität zwischen verschiedenen, aber überlappenden Schnittstellentypen sicherzustellen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3