go语言之sync.Map

简介

go语言自带的map,不具备线程安全;所以为了实现线程安全,可以使用sync.Map
具体示例见如下代码

package main

import (
	"fmt"
	"sync"
)

func main() {
	var testMap sync.Map

	// 获取a对应的键值应该失败
	valueA,ok := testMap.Load("a")
	if ok {
		fmt.Println("a", valueA)
	} else {
		fmt.Println("a no value" ) // true
	}

	// 设置a对应的键值,然后再获取
	testMap.Store("a", "ok1")
	valueA,ok = testMap.Load("a")
	if ok {
		fmt.Println("a", valueA) // true
	} else {
		fmt.Println("a no value")
	}

	// 设置a对应的键值,然后再获取
	testMap.Store("a", "ok2")
	valueA,ok = testMap.Load("a")
	if ok {
		fmt.Println("a", valueA) // true
	} else {
		fmt.Println("a no value")
	}

	// 设置a对应的键值,然后再获取
	// 若a存在对应键值,则只是获取,不设置新值
	valueA,ok = testMap.LoadOrStore("a", "ok3")
	if ok {
		fmt.Println("a", valueA) // true
	} else {
		fmt.Println("a no value")
	}
	valueA,ok = testMap.Load("a")
	if ok {
		fmt.Println("a", valueA) // true
	} else {
		fmt.Println("a no value")
	}
	// 若a不存在对应键值,则进行设置
	valueB,ok := testMap.LoadOrStore("b", "ok3")
	if ok {
		fmt.Println("b", valueB)
	} else {
		fmt.Println("b no value") // true
	}
	valueB,ok = testMap.Load("b")
	if ok {
		fmt.Println("b", valueB) // true
	} else {
		fmt.Println("b no value")
	}

	// 遍历
	testMap.Range(func(key, value interface{}) bool {
		keyInfo := key.(string)
		valueInfo := value.(string)
		fmt.Println("keyInfo", keyInfo, "valueInfo", valueInfo)
		return true
	})

	// 删除
	testMap.Delete("a")
}

运行结果

a no value
a ok1
a ok2
a ok2
a ok2
b no value
b ok3
keyInfo a valueInfo ok2
keyInfo b valueInfo ok3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值