1、map基本使用
map声明
var m4 map[int]int //只是声明 没有开辟空间
m4[1]=100 //报错
log.Println(m4)
创建
//1
m3:=make(map[int]string,100) //可以指定长度
log.Println(len(m3)) //0 键值对的数量
m2:=make(map[string]string) //使用默认长度
m2["你"] = "你好啊"
log.Println(m2)
//2
d2 :=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底层结构
借鉴了如下博客。写的很好
先来观摩一波map底层结构,第一眼肯定万脸懵逼