In Go kann es beim Umgang mit mehreren Schnittstellen mit derselben Methodensignatur, die jedoch in separaten Paketen definiert sind, zu Situationen kommen, in denen Ein Typ, der beide Schnittstellen implementiert, führt zu unerwartetem Verhalten.
Bedenken Sie, dass diese beiden Schnittstellen (Doer) und Funktionen (FuncA und FuncB) unterschiedlich definiert sind Pakete:
// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)
// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)
Wenn ein Typ C Doer aus beiden Paketen implementiert und die Implementierung unterschiedlich ist:
// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }
func main() {
cA := C(0); A.FuncA(cA)
cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}
Um dieses Problem zu lösen, legt das Typsystem von Go Wert auf Übereinstimmung nach Namen und Konsistenz in Typen. Während es einem Objekt ermöglicht, mehrere Schnittstellen zu erfüllen, muss die Implementierung der gemeinsam genutzten Methode alle anwendbaren Schnittstellenverträge einhalten.
Im obigen Szenario umfasst eine Problemumgehung die Implementierung von Wrapper-Typen:
// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }
func main() {
cA := DoerA{C(0)}; A.FuncA(cA)
cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}
Durch die Erstellung dieser Wrapper können Sie die Implementierung von Do() basierend auf der beabsichtigten Schnittstellennutzung steuern und so die Konsistenz innerhalb der jeweiligen Paketkontexte sicherstellen.
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