Schnittstellen-/Implementierungsgleichzeitigkeit in Golang-Generika
Betrachten Sie die Aufgabe, eine generische Funktion zu erstellen, um ein Segment mit initialisierten Werten zu füllen. Obwohl dies einfach erscheinen mag, entstehen Herausforderungen, wenn versucht wird, Schnittstellenabschnitte zu verwenden und konkrete Typen innerhalb der Funktion anzugeben.
In Go 1.18 führt die Einschränkung von X und Y als beliebige Typen innerhalb der generischen Funktion Fill zu einem Verlust einer Beziehung zwischen der Schnittstelle und ihren Implementierern. Dies verhindert die Zuweisung von Instanzen von Y zu Slice[i] innerhalb der Funktion.
Um dies zu umgehen, kann eine explizite Behauptung verwendet werden:
func Fill[X, Y any](slice []X) {
for i := range slice {
slice[i] = any(*new(Y)).(X)
}
}
Dieser Ansatz gerät jedoch in Panik, wenn Y X nicht implementiert. Darüber hinaus führt die Verwendung eines Zeigertyps für Y zum Verlust von Informationen über den Basistyp und zu einem Null-Basiswert.
Zu Um diese Probleme zu beheben, wird empfohlen, eine Konstruktorfunktion anstelle eines zweiten Typparameters zu verwenden:
func main() {
xs := make([]sync.Locker, 10)
Fill(xs, func() sync.Locker { return &sync.Mutex{} })
}
func Fill[X any](slice []X, f func() X) {
for i := range slice {
slice[i] = f()
}
}
Dieser Ansatz füllt den Slice effektiv mit initialisierten Werten, die von der Konstruktorfunktion erstellt wurden, und bietet so eine robustere und flexiblere Lösung des Problems.
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