Wie kann man über die Vereinigung von Slices iterieren, die in einer generischen Funktion übergeben werden? (Kernloser T-Typ)

WBOY
Freigeben: 2024-02-06 08:50:08
nach vorne
356 Leute haben es durchsucht

如何迭代通用函数中传递的切片并集? (T无芯型)

Frageninhalt

Ich teste Generika in Go 1.18 und habe mir dieses Beispiel angesehen. Ich möchte dieses Beispiel nachbilden, aber in der Lage sein, ein Int-Slice oder ein Float-Slice zu übergeben, und in der Funktion werde ich alles im Slice summieren.

Dabei stieß ich beim Durchlaufen der Slices auf einige Probleme. Folgendes habe ich versucht:

package main

import "fmt"

// numberslice constraint
type numberslice interface {
    []int64 | []float64
}

func add[n numberslice](n n) {
    // want: to range over n and print value of v 
    for _, v := range n {
        fmt.println(v)
    }
}

func main() {
    ints := []int64{1, 2}
    add(ints)
}
Nach dem Login kopieren

Ich erhalte die Fehlermeldung:

cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
Nach dem Login kopieren

Wie erreiche ich dieses Ziel?


Richtige Antwort


Der Kerntyp einer Schnittstelle (einschließlich Schnittstelleneinschränkungen) ist wie folgt definiert:

Eine Schnittstelle t hat einen Kerntyp, wenn eine der folgenden Bedingungen erfüllt ist: Zufrieden:

  • Es gibt einen einzelnen Typu, der der zugrunde liegende Typ aller Typen im T-Typ-Satz ist

  • Oder die Typenmenge von t enthält nur Kanaltypen mit demselben Elementtyp e, und alle gerichteten Kanäle haben die gleiche Richtung.

Ihre Schnittstellenbeschränkung hat keinen Kerntyp, da sie zwei zugrunde liegende Typen hat: []int64[]float64.

Sie können es also nicht verwenden, wenn ein Kerntyp erforderlich ist. Besonders rangemake.

Sie können die Schnittstelle so ändern, dass sie den Basistyp erfordert, und dann den Slice in der Funktionssignatur angeben:

// still no core type...
type number interface {
    int64 | float64
}

// ...but the argument will be instantiated with either int64 or float64
func add[n number](n []n) {
    for _, v := range n {
        fmt.println(v)
    }
}
Nach dem Login kopieren

Das funktioniert auch, ist aber ausführlicher:

type NumberSlice[N int64 | float64] interface {
    // one core type []N
    ~[]N
}

func add[S NumberSlice[N], N int64 | float64](n S) {
    for _, v := range n {
        fmt.Println(v)
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man über die Vereinigung von Slices iterieren, die in einer generischen Funktion übergeben werden? (Kernloser T-Typ). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
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!