golang代码实例库

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1912|回复: 0

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

[复制链接]

82

主题

82

帖子

486

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
486
发表于 2022-3-26 20:29:46 | 显示全部楼层 |阅读模式
实例说明
在多个goroutine中操作map,很容易引起程序崩溃,这个时候,我们需要使用并发安全的sync.map
1)sync.map的各种用法


实例代码
[Golang] 纯文本查看 复制代码
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)
	}

}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|golang代码实例库 ( 粤ICP备2021162396号 )

GMT+8, 2024-11-3 05:50 , Processed in 0.016276 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表