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

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

WBOY
WBOYnach vorne
2024-02-06 08:50:08377Durchsuche

如何迭代通用函数中传递的切片并集? (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)
}

Ich erhalte die Fehlermeldung:

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

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)
    }
}

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)
    }
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen