go语言的map基本使用和底层原理
1、map基本使用
map声明
var m4 map[int]int //只是声明 没有开辟空间m4[1]=100 //报错log.Println(m4)
创建
//1m3:=make(map[int]string,100) //可以指定长度log.Println(len(m3)) //0 键值对的数量m2:=make(map[string]string) //使用默认长度m2["你"] = "你好啊"log.Println(m2)//2d2 :=map[string]int{"one":1, "tow":2} //初始化d3 :=map[int]int{} //创建了空map
判断值是否存在
只接受一个的话默认返回的是value,两个的话有exists
//判断是否存在val,exists :=d3["tow"] //如果不存在 返回零值 exists为false
map遍历
m5:=map[string]string{"one":"1","tow":"2","three":"3"}for k:=range m5{ //默认是key log.Println(k) //one tow...}for k,v:=range m5{ //k-v log.Println(k,v) //}
删除
m5:=map[string]string{"one":"1","tow":"2","three":"3"}delete(m5, "one")
2、map和set
go没有内置set类型,但是可以用map很轻松模仿,因为map的key是唯一的
type StrSet struct { data map[string]bool sync.RWMutex //读写锁 保证线程安全}func New() *StrSet { return &StrSet{ data: make(map[string]bool), } }func (this *StrSet)Add(val string) { this.Lock() defer this.Unlock() if this.data==nil{ this = New() } this.data[val] = true}func (this *StrSet)Delete(val string) { this.Lock() defer this.Unlock() if this.data==nil{ return } delete(this.data,val) }func (this *StrSet) IsExist(val string) bool { this.RLock() defer this.RUnlock() if this.data==nil{ return false } _,ok:=this.data[val] return ok }func (this *StrSet) GetAll() (result []string) { if this.data==nil{ return } for val :=range this.data{ result = append(result, val) } return}func (this *StrSet) Clear() { this.Lock() defer this.Unlock() this.data = map[string]bool{} }func main() { s:=New() s.Add("panbin") s.Add("biningo") s.Add("a") s.Add("b") s.Add("panbin") log.Println(s.GetAll()) }
3、map底层结构
借鉴了如下博客。写的很好
深入Go的Map使用和实现原理
先来观摩一波map底层结构,第一眼肯定万脸懵逼
相关推荐
Lzs 2020-10-23
聚合室 2020-11-16
零 2020-09-18
Justhavefun 2020-10-22
jacktangj 2020-10-14
ChaITSimpleLove 2020-10-06
Andrea0 2020-09-18
周游列国之仕子 2020-09-15
afanti 2020-09-16
88234852 2020-09-15
YClimb 2020-09-15
风雨断肠人 2020-09-04
卖口粥湛蓝的天空 2020-09-15
stulen 2020-09-15
pythonxuexi 2020-09-06
abfdada 2020-08-26
梦的天空 2020-08-25