**Wie bleiben Schnittstellen-Implementor-Beziehungen erhalten, wenn Generics in Go für die Slice-Initialisierung verwendet werden?**

DDD
Freigeben: 2024-10-25 17:22:02
Original
488 Leute haben es durchsucht

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

Schnittstellen-/Implementierungsgleichzeitigkeit in Golang-Generika

Betrachten Sie die Aufgabe, eine generische Funktion zu erstellen, um ein Slice 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:

<code class="go">func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}</code>
Nach dem Login kopieren

Dieser Ansatz gerät jedoch in Panik, wenn Y implementiert X nicht. Darüber hinaus führt die Verwendung eines Zeigertyps für Y zum Verlust von Informationen über den Basistyp und zu einem Null-Basiswert.

Um diese Probleme zu beheben, wird empfohlen, stattdessen eine Konstruktorfunktion zu verwenden ein zweiter Typparameter:

<code class="go">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()
    }
}</code>
Nach dem Login kopieren

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.

Das obige ist der detaillierte Inhalt von**Wie bleiben Schnittstellen-Implementor-Beziehungen erhalten, wenn Generics in Go für die Slice-Initialisierung verwendet werden?**. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!