[GOLANG] Valeurs unique de chaque maps "map[string]map[string]string"

Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Je cherche un moyen d'optimiser la fonction que j'ai écrit qui me permet determiner les clés/valeurs uniques, elles méme présentent dans plusieurs maps.

J'ai en valeur d'entré cette structure: map[string]map[string]string
{
  "deploymentAbc": {
    "app": "nginx",
    "env": "dev",
    "composant": "nginx",
    "type": "frontend"
  },
  "deploymentBcd": {
    "app": "mongo",
    "env": "dev",
    "composant": "mongo-db",
    "type": "database"
  },
  "deploymentEfg": {
    "app": "mongo",
    "env": "dev",
    "composant": "mongo-express",
    "type": "database"
  },
  "deploymentHij": {
    "app": "php",
    "env": "dev",
    "composant": "authz",
    "type": "backend"
  }
}


J'ai en valeur de sortie cette structure: map[string][]string
{
  "deploymentAbc": [
    "app=nginx",
    "composant=nginx",
    "type=frontend"
  ],
  "deploymentBcd": [
    "composant=mongo-db"
  ],
  "deploymentEfg": [
    "composant=mongo-express"
  ],
  "deploymentHij": [
    "app=php",
    "composant=authz",
    "type=backend"
  ]
}

La fonction que j'ai écrit:
func FindUniqueLabels(composants map[string]map[string]string) map[string][]string {
        unique := make(map[string][]string, len(composants))
        for composant, o := range composants {
                for labelName, labelValue := range o {
                        skip := false
                        label := fmt.Sprintf("%s=%s", labelName, labelValue)
                        for composantO, uo := range composants {
                                if composant != composantO {
                                        for labelNameO, labelValueO := range uo {
                                                labelO := fmt.Sprintf("%s=%s", labelNameO, labelValueO)
                                                if label == labelO {
                                                        skip = true
                                                }
                                        }
                                }
                        }
                        if !skip {
                                unique[composant] = append(unique[composant], label)
                        }
                }
        }
        return unique
}


Je suis pas fan de mes boucles dans mes boucles et je me demande s'il n'existerait pas déja des fonctions ou libs qui font le travaille...

J'ai déja vu des fonctions qui s'appelle elle même, mais je vois pas comment l'implémenter ni ne sais le reel gain de perf que ça peut permettre.

Si quelqu'un voit comment on peut faire plus propre et joli je suis preneur !

Bien à vous
Exil'

Configuration: Linux / Chrome 94.0.4606.71


A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
le point de départ, ce serait d'expliquer ce que doit réaliser le programme.
"determiner les clés/valeurs uniques, elles méme présentent dans plusieurs maps", ce n'est pas trop clair.

ce que tu appelles valeur d'entré et valeur de sortie, c'est un exemple de ce que tu attends de ton programme?
1
Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention   150
 
Hello, merci pour ta réponse !

Effectivement, je n'ai pas donné beaucoup de contexte...

Je suis en train d'écrire un programme d'autogénération de tests, en me basant sur l'api Kubernetes pour découvrir les différents objets.

À un moment donné, j'ai besoin de pouvoir identifier clairement un composant d'un autre, par un label.

Les labels n'étant pas uniformisés, j'ai eu besoin de trouver un moyen de déterminer dynamiquement quel est le label (clé/valeur) unique pour chacun des composants, d'où l'écriture de cette fonction

Ce que je présente comme "valeur d'entrée" est la data fourni en entrée à ma fonction "FindUniqueLabels"
Ce que je présente comme "valeur de sortie" est la data fourni en sortie par ma fonction.

N'étant pas super satisfait de la fonction que j'ai écrite ( qui fonctionne, cela dit), je souhaite l'optimiser ou bénéficier de l'expérience d'autres en matière d'algo pour rendre le code plus lisible / propre / optimisé ! :)

Le source est là si jamais :)
https://github.com/Vr00mm/litmus-hub-gen-auto/blob/main/pkg/requirements/requirements.go#L9

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Veux-tu simplement éliminer tous les labels utilisés plusieurs fois?

Si je devine ce que fait ton code, tu parcours ta structure source, et, pour chaque label, 
tu parcours la structure source complète pour vérifier si il n'est pas présent ailleurs.
Si le label n'est pas trouvé ailleurs, tu le copies dans la structure de destination


Il n'est pas utile de parcourir toute la structure source, tu pourrais t'arrêter dès que tu as trouvé un doublon.

Moi je ferais plutôt ainsi:
Je recopie la structure source vers la destination (si je veux préserver la structure source).
Ensuite, je parcours la structure destination, et, pour chaque label:
je parcours la suite de la structure destination
(pas depuis le début, mais à partir du composant
suivant le composant ayant ce label)
si je rencontre un doublon, je l'élimine
si j'ai rencontré un doublon du label, j'élimine le label
0