web-dev-qa-db-fra.com

Golang: convertir des tranches en carte

Existe-t-il un moyen facile/simple de convertir une tranche en carte à Golang? Comme convertir un tableau en hachage en Perl est facile à faire avec une affectation simple comme %hash = @array ce qui précède convertira tous les éléments du tableau en un hachage, les clés étant des éléments d'index de numéro pair tandis que les valeurs seront des éléments d'index de numéro impair du tableau.

Dans mon code Go, j'ai des tranches de chaîne et je voudrais le convertir en carte. Je me demande s'il existe un code de bibliothèque Go pour ce faire.

func main() {
  var elements []string
  var elementMap map[string]string
  elements = []string{"abc", "def", "fgi", "adi"}
}

la tranche d'éléments doit être convertie en carte de chaînes, elementMap.

merci

14
Nikhil Mulley

Utilisez une boucle for:

elements = []string{"abc", "def", "fgi", "adi"}
elementMap := make(map[string]string)
for i := 0; i < len(elements); i +=2 {
    elementMap[elements[i]] = elements[i+1]
}

runnable example on the playground

La bibliothèque standard n'a pas de fonction pour ce faire.

14
Cerise Limón

Il n'y a actuellement aucun moyen de le faire à la manière de Perl. Il vous suffit d'itérer la tranche et de placer les éléments de tranche dans votre carte, par ex. comme clé de la carte:

func main() {
    var elements []string
    var elementMap map[string]string
    elements = []string{"abc", "def", "fgi", "adi"}

    // initialize map
    elementMap = make(map[string]string)

    // put slice values into map
    for _, s := range elements {  
        elementMap[s] = s
        // or just keys, without values: elementMap[s] = ""
    }

    // print map
    for k := range elementMap {
        fmt.Println(k)
    }
}

Selon ce que vous voulez faire, vous devez garder une chose à l'esprit: les clés de carte sont uniques, donc si votre tranche contient des chaînes en double, vous voudrez peut-être compter en utilisant un map[string]int:

func main() {
    var elements []string
    var elementMap map[string]int
    elements = []string{"abc", "def", "fgi", "adi", "fgi", "adi"}

    // initialize map
    elementMap = make(map[string]int)

    // increment map's value for every key from slice
    for _, s := range elements {  
        elementMap[s]++
    }

    // print map
    for k, v := range elementMap {
        fmt.Println(k, v)
    }
}

Et vous pouvez toujours envelopper cette fonctionnalité dans une fonction:

func sliceToStrMap(elements []string) map[string]string {
    elementMap := make(map[string]string)
    for _, s := range elements {
        elementMap[s] = s
    }
    return elementMap
}

func sliceToIntMap(elements []string) map[string]int {
    elementMap := make(map[string]int)
    for _, s := range elements {
        elementMap[s]++
    }
    return elementMap
}
2
Kiril