本系列前面的文章:数组
map是一种映射,能够将键(key
)映射到值(value
),格式为:map[keyType]valueType
。函数
声明一个map并初始化它,使用key:value
进行初始化:code
var scores = map[string]int {"数学":100, "语文":90, "Go":100}
若是不想直接初始化,能够先声明再使用,注意这样须要使用make
函数初始化后才能使用:get
var scores map[string]int scores = make(map[string]int)
为何这样声明须要使用make
函数?数学
map
的零值是nil map
,没有键,也不能添加键。string
var m map[string]int //声明一个m map,它如今默认是nil fmt.Println(m) //map[] m["A"] = 1 //报错:assignment to entry in nil map
因此为了避免让该map
不是nil
,须要使用make
初始化:入门
var m map[string]int //nil m = make(map[string]int) //初始化 m["A"] = 1 //添加元素 fmt.Println(m) //map[A:1]
固然,方便的短变量声明方式也能用:class
m := map[string]int {"A":1, "B":2} 或者 m := make(map[string]int) m["A"] = 1 m["B"] = 2
(增)增长键值对:import
scores["数学"] = 100 //向scores这个map添加了键为“数学”,值为100的数据 scores["语文"] = 90
(删)删除键值对:基础
delete(scores, "语文")
(改)修改键值对和增长键值对的语法相同(当key
不存在时为增长,当key
存在时为修改):
scores["语文"] = 10
(查)使用key
能够查找到对应的value
,会返回两个值,第一个是key
对应的value
,第二个是布尔值(若是key
存在,是true
;不然是false
)。若是查找的key
不存在,则会返回value
类型的“零值”:
score, exist := scores["数学"] //使用两个返回值 fmt.Println(score, exist) //100 true score1 := scores["语文"] //使用一个返回值 fmt.Println(score1) //90 score2, exist2 := scores["Java"] //查找不存在的key fmt.Println(score2, exist2) //0 false
和slice
同样,map
也是引用类型,则意味着,若是有几个map
同时指向一个底层map
,其中一个map
改变某个键值对,那么其余的也会作出一样的改变(由于底层map
变了)。
package main import "fmt" func main() { map0 := make(map[string]string) //底层map0 map0["name"] = "XingXiaoguan" //增长一个键值对 //map1 map2 引用map0 map1 := map0 map2 := map0 fmt.Println(map0["name"], map1["name"], map2["name"]) //都是XingXiaoguan map1["name"] = "XingRenGuanXue" //改变map1的name对应的值 fmt.Println(map0["name"], map1["name"], map2["name"]) //所有变为XingRenGuanXue }
使用len
函数能够获取map
中key
的数量:
keyNum := len(scores) //获取scores这个map中key的数量
map
是无序的,因此其返回的元素顺序可能每次都不一样。
可使用range
关键字遍历map
,这里range
返回的第一个值是key
,第二个值是value
:
//遍历scores map for key, value := range scores { fmt.Println(key, value) } 输出: 数学 100 语文 90
若有错误,还请指正。
点击 这里认识我 。 (^o^)/