Heim  >  Artikel  >  Backend-Entwicklung  >  Universelle Funktion zum Konvertieren einer Karte in eine Liste in GO

Universelle Funktion zum Konvertieren einer Karte in eine Liste in GO

WBOY
WBOYnach vorne
2024-02-13 20:30:12702Durchsuche

GO 中将 Map 转换为 List 的通用函数

php-Editor Strawberry stellt Ihnen ein praktisches Tool namens „Universelle Funktion zum Konvertieren von Karte in Liste in GO“ vor. Mit dieser Funktion können Sie die Datenstruktur der Schlüsselwertzuordnung (Map) in eine Listendatenstruktur (List) konvertieren. Mit dieser allgemeinen Funktion können Sie komplexe Datenstrukturen einfach in eine prägnantere Form umwandeln und so die Lesbarkeit und Wartbarkeit Ihres Codes verbessern. Unabhängig davon, ob Sie bei der Entwicklung auf ähnliche Anforderungen gestoßen sind oder mehr Techniken zur Konvertierung von Datenstrukturen kennenlernen möchten, wird Ihnen diese universelle Funktion Komfort und Inspiration bieten. Lassen Sie uns dieses nützliche Tool gemeinsam erkunden!

Frageninhalt

Wie schreibe ich eine Funktion in Go, die jede Karte in eine Liste von Objekten umwandelt (Schlüssel entfernen)?

Zum Beispiel:

func maptolist(inputmap map[any]any) any {
    var resultlist []any 
    for _, obj := range inputmap {
        resultlist = append(resultlist, obj)
    }
    return resultlist
}

func main() {
    mymap := make(map[string]string)
    mymap["a"] = "1"
    mymap["b"] = "12"
    l := maptolist(mymap).([]string)
    fmt.printf("(%v, %t)\n", l, l)
}

gibt Folgendes aus: ([1 12], []string)

Aber ich habe immer Typprobleme und habe keine Lösung gefunden. Ich hatte ein ähnliches Problem bei der Verwendung von Typzusicherungen oder -konvertierungen.

cannot use myMap (variable of type map[string]string) as map[any]any value in argument to mapToList

Wie soll ich die Funktion „maptolist()“ schreiben?

Es muss als Eingabe verwendet werden inputmap map[any]anyinputmap any, da ich jede Art von Karte übergeben möchte (map[string]customstruct; map[int][]customstruct usw.)

Update: Ich habe die Funktion und weitere Details zu den Eingaben hinzugefügt, als ich sie zum ersten Mal geschrieben habe.

Problemumgehung

Siehe dieses Tutorial zu Generika oder die Sprachspezifikation

any不是变量类型,它是一个type约束,可以使用的类型的描述。您需要使用约束 any Definieren Sie Typparameter und verweisen Sie dann über die Parametersignatur auf den generischen Typ.

//                                 | from this point on, k and v are
//                                 | now valid types to use in the function
func maptoslice[k comparable, v any](m map[k]v) []v {
    s := make([]v, 0, len(m))
    for _, v := range m {
        s = append(s, v)
    }
    return s
}
Die

Parameterm必须是map[k]v,其中kcomparable类型,vany类型。返回类型 []v sind Slices vom gleichen Typ wie die Werte in der Eingabezuordnung.

Bitte beachten Sie, any 不能用作映射键的约束,因为并非所有类型都可以用作键,只有 可比较的 Typ.

Um die Methode aufzurufen, übergeben Sie dann einen Typ, der die Einschränkung erfüllt (z. B. map[string][]string), und zeigen Sie optional den Typparameter explizit an.

m := map[string][]string{
    "a": {"b", "c"},
    "d": {"e", "f"},
}
s := maptoslice(m)
// or
t := maptoslice[string, []string](m)
// [[b c] [e f]]

Indem Sie die Typen explizit angeben, können Sie Ihren Code selbst dokumentieren und unerwartete Typprobleme erkennen. Der folgende Code gibt beispielsweise einen Fehler zurück:

v := mapToSlice[string, []int](m)
...
./main.go:14:33: cannot use m (variable of type map[string][]string) as map[string][]int value in argument to mapToSlice[string, []int]

Das obige ist der detaillierte Inhalt vonUniverselle Funktion zum Konvertieren einer Karte in eine Liste in GO. 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