admin 发表于 2022-3-26 20:29:46

golang:使用sync.map进行并发安全的map操作

■实例说明
在多个goroutine中操作map,很容易引起程序崩溃,这个时候,我们需要使用并发安全的sync.map
1)sync.map的各种用法


■实例代码
package main

import (
        "fmt"
        "sync"
)

func main() {
        // 创建goroutine安全的map
        sm := sync.Map{}

        // 等待多个写成执行完成
        wc := sync.WaitGroup{}
        for i := 0; i < 10; i++ {
                wc.Add(1)
                go func(i int) {
                        defer wc.Done()

                        // 【1】业务代码,向map中保存数据
                        k := fmt.Sprintf("key%d", i)
                        sm.Store(k, i)

                        // 【2】获取键值k对应的值,如果存在,则返回该值,如果该键不存在,则将默认值存入,并返回
                        // loaded=true,则返回的是已有的值,如果返回false,则返回的是默认值,即原来没有这个键值
                        v, loaded := sm.LoadOrStore("k", i)
                        fmt.Printf("v:%+v, loaded=%+v\n", v, loaded)

                        if i == 2 {
                                // 【3】删除某个键值
                                sm.Delete(i)
                        }
                }(i)
        }
        wc.Wait()

        // 【5】遍历map
        sm.Range(func(key, value interface{}) bool {
                fmt.Printf("key=%+v, value=%+v\n", key, value)

                // 注意,如果合理返回false,则停止遍历
                if key.(string) == "key3" {
                        return false
                }
                return true
        })

        // 【6】获取map中数据
        value1, _ := sm.Load("key1")
        v1, ok := value1.(int)
        if ok {
                fmt.Printf("v1=%d", v1)
        }

}

页: [1]
查看完整版本: golang:使用sync.map进行并发安全的map操作