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底层结构,第一眼肯定万脸懵逼

相关推荐