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

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

DDD
DDDOriginal
2024-10-25 17:22:02566Durchsuche

**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>

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>

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!

Stellungnahme:
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