Aufrufen von Methoden für Union-Einschränkungen in Go Generics
In Go Generics (v1.18) können Sie auf eine Typ-Union-Einschränkung stoßen, die begrenzt den Parametertyp für Typen, die eine einheitliche Schnittstelle implementieren. Die Unfähigkeit, gemeinsam genutzte Methoden zwischen den eingeschränkten Typen aufzurufen, wirft jedoch Bedenken hinsichtlich der Nützlichkeit solcher Einschränkungen auf.
Betrachten Sie den folgenden Code:
type A struct {} type B struct {} type AB interface { *A | *B } func (a *A) some() bool { return true } func (b *B) some() bool { return false } func some[T AB](x T) bool { return x.some() } // Compiler error
Der Compilerfehler „x.some undefiniert“ ist auf die Tatsache zurückzuführen, dass die Typunionsbeschränkung *A | *B garantiert nicht das Vorhandensein einer bestimmten Methode sowohl auf *A als auch auf *B.
Um dieses Problem zu beheben, können Sie die Methode zur Schnittstellenbeschränkung hinzufügen:
type AB interface { *A | *B; some() bool } func some[T AB](x T) bool { return x.some() } // Works
Dies beschränkt T auf Typen, die sowohl *A als auch *B implementieren und die Methode some deklarieren.
Diese Lösung wird jedoch als Workaround für das angesehen, was idealerweise nur mit Typunionen funktionieren sollte. Go 1.18 weist derzeit Einschränkungen auf, da der Compiler den Aufruf einer Methode für einen Wert vom Typparameter P nur dann unterstützt, wenn die Methode m explizit durch die Einschränkungsschnittstelle von P deklariert wird. Obwohl die Sprachspezifikationen besagen, dass der Methodensatz einer Schnittstelle die Schnittmenge der Methodensätze jedes Typs im Typsatz der Schnittstelle ist. Dieses Problem wird voraussichtlich in Go 1.19 behoben.
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