Heim >Backend-Entwicklung >Golang >Können die Union-Einschränkungen von Go Generics gemeinsam genutzte Methoden ohne explizite Schnittstellendeklaration aufrufen?
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 eine Einschränkung bewirkt 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.
Bedenken 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“ liegt daran, dass die Typ-Union-Beschrä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.
Das obige ist der detaillierte Inhalt vonKönnen die Union-Einschränkungen von Go Generics gemeinsam genutzte Methoden ohne explizite Schnittstellendeklaration aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!