Maison  >  Article  >  développement back-end  >  Fonction universelle pour convertir une carte en liste dans GO

Fonction universelle pour convertir une carte en liste dans GO

WBOY
WBOYavant
2024-02-13 20:30:12702parcourir

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

l'éditeur php Strawberry vous présente un outil pratique appelé "Fonction universelle pour convertir une carte en liste dans GO". Cette fonction peut vous aider à convertir la structure de données de la carte clé-valeur (Map) en une structure de données de liste (List). Grâce à cette fonction générale, vous pouvez facilement convertir des structures de données complexes en une forme plus concise, améliorant ainsi la lisibilité et la maintenabilité de votre code. Que vous ayez rencontré des besoins similaires en matière de développement ou que vous souhaitiez en savoir plus sur les techniques de conversion de structure de données, cette fonction universelle vous apportera commodité et inspiration. Explorons ensemble cet outil utile !

Contenu de la question

Comment écrire une fonction en go qui convertit n'importe quelle carte en liste d'objets (suppression de clés) ?

Par exemple :

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

affichera : ([1 12], []string)

Mais j'ai toujours des problèmes de type et je n'ai pas trouvé de solution. J'ai eu un problème similaire lors de l'utilisation d'assertions de type ou de conversions.

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

Comment dois-je écrire la fonction maptolist() ?

Il doit être pris en entrée inputmap map[any]anyinputmap any car je veux passer n'importe quel type de carte (map[string]customstruct; map[int][]customstruct etc.)

Mise à jour : j'ai ajouté la fonction et plus de détails sur les entrées lorsque je l'ai écrit pour la première fois

Solution de contournement

Voir ce tutoriel sur les génériques ou la Spécification du langage

any不是变量类型,它是一个type约束,可以使用的类型的描述。您需要使用约束 any Définissez les paramètres de type puis référencez le type générique à partir de la signature du paramètre.

//                                 | 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
}
Les

paramètresm必须是map[k]v,其中kcomparable类型,vany类型。返回类型 []v seront des tranches du même type que les valeurs de la carte d'entrée.

Veuillez noter que any 不能用作映射键的约束,因为并非所有类型都可以用作键,只有 可比较的 tapez.

Ensuite, pour appeler la méthode, transmettez un type qui satisfait la contrainte (par exemple map[string][]string), en affichant éventuellement explicitement le paramètre de type.

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

En étant explicite sur les types, vous pouvez documenter votre code vous-même et détecter tout problème de type inattendu. Par exemple, le code suivant renverra une erreur :

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]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer