maps.Collect în Go

Collect construiește un map nou din perechile unui iterator; Insert adaugă perechile într-un map existent.

Sintaxă
import "maps"

func Collect[K comparable, V any](seq iter.Seq2[K, V]) map[K]V
func Insert[Map ~map[K]V, K comparable, V any](m Map, seq iter.Seq2[K, V])

Ce face maps.Collect

maps.Collect(seq) parcurge un iterator de perechi (iter.Seq2) și construiește un map nou cu ele. Dacă aceeași cheie apare de mai multe ori, rămâne ultima valoare.

maps.Insert(m, seq) pune perechile în map-ul m, care trebuie să existe deja (nu nil). Cheile existente sunt suprascrise.

Sursa perechilor poate fi maps.All, slices.All (indice, valoare) sau un iterator scris de tine.

Parametri

Parametru Descriere
seq Iteratorul de perechi cheie–valoare.
m Pentru Insert: map-ul în care se adaugă.

Ce returnează

Collect: un map nou. Insert: nimic, modifică m.

Exemple

Exemplul 1: Inversarea unui map cu un iterator propriu

inversat produce perechile (valoare, cheie). Collect construiește din ele map-ul invers: din cod poștal în oraș.

package main

import (
    "fmt"
    "iter"
    "maps"
)

func inversat[K, V comparable](m map[K]V) iter.Seq2[V, K] {
    return func(yield func(V, K) bool) {
        for k, v := range m {
            if !yield(v, k) {
                return
            }
        }
    }
}

func main() {
    coduri := map[string]string{"Iași": "700001", "Cluj-Napoca": "400001", "Arad": "310001"}
    oraseDupaCod := maps.Collect(inversat(coduri))
    fmt.Println(oraseDupaCod)
}

Rezultat

map[310001:Arad 400001:Cluj-Napoca 700001:Iași]

Exemplul 2: Insert completează un map existent

Perechile (indice, nume) se adaugă lângă cheia 3 existentă. În al doilea map, cheia lapte exista deja și primește valoarea nouă.

package main

import (
    "fmt"
    "maps"
    "slices"
)

func main() {
    locuri := map[int]string{3: "Ana"}
    maps.Insert(locuri, slices.All([]string{"Mihai", "Ioana", "Radu"}))
    fmt.Println(locuri)

    preturi := map[string]float64{"pâine": 4.5, "lapte": 7}
    maps.Insert(preturi, maps.All(map[string]float64{"lapte": 7.5, "ouă": 15}))
    fmt.Println(preturi)
}

Rezultat

map[0:Mihai 1:Ioana 2:Radu 3:Ana]
map[lapte:7.5 ouă:15 pâine:4.5]

Greșeli frecvente

  • Apelezi maps.Insert pe un map nil (var m map[string]int): programul se oprește cu panic: assignment to entry in nil map. Creează-l cu make sau folosește Collect.

Comenzi înrudite

  • maps.All: Returnează un iterator peste perechile (cheie, valoare) ale unui map, în ordine aleatorie.
  • maps.Clone: Clone face o copie a unui map; Copy copiază toate perechile din src în dst, suprascriind cheile existente.
  • slices.Collect: Collect strânge valorile unui iterator într-un slice nou; AppendSeq le adaugă la finalul unui slice existent.
  • iter.Seq: Tipurile pentru iteratori: Seq produce valori una câte una, Seq2 produce perechi; ambele se parcurg cu for range.