Map
是无序
的、基于key-value
的数据结构,内部使用散列表hash
实现。
Map是引用类型
,声明时是nil,必须初始化才能使用。
map[keytype]valuetype
map
类型变量默认初始值是nil
,需要使用make()
函数进行初始化
make(map[keytype]valuetype, [cap])
map声明和初始化
func main() {
//声明
var a map[string]int
fmt.Println(a == nil) //true
//初始化,容量可以写,建议编程时候加上
a = make(map[string]int, 10)
fmt.Println(a == nil) //false
// 声明map并初始化
b := map[int]string{
1:"a",
2:"b",
}
fmt.Println(b) //map[1:a 2:b]
}
map使用(添加key-value、删除key、判断是否存在、遍历)
func main() {
var a map[string]int
a = make(map[string]int, 10)
//添加key-value
a["a"] = 1
a["b"] = 2
fmt.Println(a) // map[a:1 b:2]
fmt.Printf("%#v\n", a) // map[string]int{"a":1, "b":2}
fmt.Printf("type:%T\n", a) //map[string]int
//删除key-value
delete(a, "a")
fmt.Println(a) //map[b:2]
//判断key是否存在
var c = make(map[string]int, 5)
c["a"] = 1
c["b"] = 2
v, ok := c["c"]
fmt.Println(v, ok)
if ok {
fmt.Println("key=c存在,value=", v)
} else {
fmt.Println("key=c不存在")
}
//map遍历,跟添加的key顺序无关
for key, value := range c {
fmt.Println(key, value)
}
//只遍历map中的key
for key := range c {
fmt.Println(key)
}
//只遍历map中的value
for _, value := range c {
fmt.Println(value)
}
//按照固定顺序固定遍历map
var e = make(map[string]int, 100)
for i := 0; i < 50; i++ {
key := fmt.Sprintf("stu%02d", i)
//生成0~99随机整数
value := rand.Intn(100)
e[key] = value
}
fmt.Println(e)
//按照key从小到大的顺序去遍历map
keys := make([]string, 0, 100)
for key := range e {
keys = append(keys, key)
}
//内置函数进行排序
sort.Strings(keys)
for _, key := range keys {
fmt.Println(key, e[key])
}
}
元素为map的切片
func main() {
//元素为map的切片
//切片初始化
var a = make([]map[string]int, 5, 10)
fmt.Println(a[0] == nil) //true
//内部map的初始化
a[0] = make(map[string]int, 5)
a[0]["a"] = 1
fmt.Println(a) //[map[a:1] map[] map[] map[] map[]]
}
值为切片的map
func main() {
//值为切片的map
var b = make(map[string][]int, 5)
v, ok := b["a"]
if ok {
fmt.Println(v)
} else {
//对切片的初始化
b["a"] = make([]int, 5)
b["a"][0] = 100
b["a"][1] = 200
b["a"][2] = 300
fmt.Println(b) //map[a:[100 200 300 0 0]]
}
}
小练习:统计一下每个单词出现次数
func main() {
//统计一下每个单词出现次数,例如 how do you do
str := "how do you do"
fmt.Println(str)
s := strings.Split(str, " ")
fmt.Println(s)
wordCount := make(map[string]int, 10)
for _, eachWord := range s {
fmt.Println(eachWord)
v, ok := wordCount[eachWord]
fmt.Println(v, ok)
if ok {
wordCount[eachWord] += 1
} else {
wordCount[eachWord] = 1
}
}
fmt.Println(wordCount)
}
有疑问加站长微信联系(非本文作者)