前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go编程基础-基础篇 11

Go编程基础-基础篇 11

原创
作者头像
未来最可爱的人
修改2021-03-05 10:10:21
2430
修改2021-03-05 10:10:21
举报
文章被收录于专栏:编程基础编程基础

无锁的map

是线程不安全的 map,多个线程同时访问这个类型的 map 的同一个变量时,会有读写冲突,会导致系统奔溃

map 的创建

map 的底层结构也是一个指针,并不是声明后立刻能够使用。和切片相同,需要使用make()函数进行初始化。在初始化之前为空,没有零值。

代码语言:javascript
复制
package main

import "fmt"

func main() {
	var m map[string]string
	fmt.Println(m == nil)
	m = make(map[string]string)
	fmt.Println(m == nil)
}
代码语言:javascript
复制
true
false

map 的赋值

使用:=使map在定义的时候直接赋值

使用map[key]=value的形式对map进行赋值

代码语言:javascript
复制
package main

import "fmt"

func main() {
	m1 := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
	fmt.Println(m1["Apple"])
	m2 := make(map[string]string)
	m2["Apple"] = "苹果"
	m2["Orange"] = "橘子"
	m2["Banana"] = "香蕉"
	fmt.Println(m2["Apple"])
}
代码语言:javascript
复制
苹果
苹果

map 的遍历

使用了一个叫做range的关键字,配合for循环结构来对map结构进行遍历

代码语言:javascript
复制
package main

import "fmt"

func main() {
	m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
	for k, v := range m {
		fmt.Println("key:", k, ", value:", v)
	}
}
代码语言:javascript
复制
key: Banana , value: 香蕉
key: Apple , value: 苹果
key: Orange , value: 橘子

map 的删除

函数delete(map,key)来移除 map 中的 key 和 value

代码语言:javascript
复制
package main

import "fmt"

func main() {
	m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
	fmt.Println(m)
	delete(m, "Apple")
	fmt.Println(m)
}
代码语言:javascript
复制
map[Apple:苹果 Banana:香蕉 Orange:橘子]
map[Banana:香蕉 Orange:橘子]

自带锁的 sync.Map

自带原子锁,保障了多线程的数据安全

sync.Map 的创建

创建不需要make,直接声明就可以使用,它底层的实现并不是指针,是一种多个变量的聚合类型,是结构体

代码语言:javascript
复制
package main

import (
	"fmt"
	"sync"
)

func main() {
	var m sync.Map
	fmt.Println(m)
}
代码语言:javascript
复制
{{0 0} {<nil>} map[] 0}

sync.Map 的操作

代码语言:javascript
复制
package main

import (
	"fmt"
	"sync"
)

func main() {
	var m sync.Map
	m.Store("Apple", "苹果")
	m.Store("Orange", "橘子")
	m.Store("Banana", "香蕉")        //使用 Store 方法给 m 赋值
	tmp, exist := m.Load("Orange") //使用 Load 取出 “Orange” 对应的值,如果不存在 “Orange” 这个 key,exist 的值为 false
	fmt.Println(tmp, exist)

	m.Delete("Banana")                    //删除 m 中的 “Banana” 和其对应的 value
	m.Range(func(k, v interface{}) bool { //使用 Range 方法遍历 m
		fmt.Println("key:", k, ", value:", v)
		return true
	})
}
代码语言:javascript
复制
橘子 true
key: Apple , value: 苹果
key: Orange , value: 橘子

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 无锁的map
  • map 的创建
  • map 的赋值
  • map 的遍历
  • map 的删除
  • 自带锁的 sync.Map
  • sync.Map 的创建
  • sync.Map 的操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档