Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to clean a sync.map?

Tags:

go

I can't have access to map inside Range loop method. I just want an equivalente method of normal map apply in sync.map https://play.golang.org/p/515_MFqSvCm

package main

import (
    "sync"
)

type list struct {
    code string
    fruit
}

type fruit struct {
    name     string
    quantity int
}

func main() {
    lists := []list{list{"asd", fruit{"Apple", 5}}, list{"ajsnd", fruit{"Apple", 10}}, list{"ajsdbh", fruit{"Peach", 15}}}
    map1 := make(map[string]fruit)
    var map2 sync.Map
    for _, e := range lists {
        map1[e.code] = e.fruit
        map2.Store(e.code, e.fruit)
    }

    //erase map
    for k, _ := range map1 {
        delete(map1, k)
    }

    //can´t pass map as argument,so I can´t delete it´s values
    map2.Range(aux)
}

func aux(key interface{}, value interface{}) bool {
    map2.Delete(key) //doesn´t work
    return true
}
like image 721
John Balvin Arias Avatar asked Mar 19 '18 03:03

John Balvin Arias


People also ask

What is sync map?

A Sync Map stores unordered JSON objects accessible via a developer-defined key. It is an unordered collection of individual Map items. After you create a Map, use the MapItem resource to add, retrieve, update, and delete items from your Map.

How does sync map work?

sync. Map uses a combination of both the atomic instructions and locks, but ensures the path to the read operations are as short as possible, with just one atomic load operation for each call to Load(...) in most cases.

Why do we sync maps?

Advantages of sync. Map. The concurrent use of multiple goroutines is safe and does not require additional locking or coordinated control. Most code should use native maps instead of separate locking or coordinated control for better type safety and maintainability.


1 Answers

For example,

//erase map
map2.Range(func(key interface{}, value interface{}) bool {
    map2.Delete(key)
    return true
})

Playground: https://play.golang.org/p/PTASV3sEIxJ

Or

//erase map
delete2 := func(key interface{}, value interface{}) bool {
    map2.Delete(key)
    return true
}
map2.Range(delete2)

Playground: https://play.golang.org/p/jd8dl71ee94

Or

func eraseSyncMap(m *sync.Map) {
    m.Range(func(key interface{}, value interface{}) bool {
        m.Delete(key)
        return true
    })
}

func main() {
    // . . .

    //erase map
    eraseSyncMap(&map2)
}

Playground: https://play.golang.org/p/lCBkUv6GJIO

Or

//erase map: A zero sync.Map is empty and ready for use.
map2 = sync.Map{}

Playground: https://play.golang.org/p/s-KYelDxqFB

like image 87
peterSO Avatar answered Oct 26 '22 11:10

peterSO