Go语言中的map
Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。
创建一个map
创建一个map类型时需要用make函数
package main
import "fmt"
func main() {
m1 := make(map[string]int, 10)
m1["a"] = 1
m1["b"] = 2
fmt.Println(m1)
}

如果直接使用赋值的形式创建一个map,那么他的值将会是nil,此时在map中存值时会报错
func main() {
var m map[string]int
fmt.Printf("%v\n", m)
fmt.Println(m == nil)
m["a"] = 1
}

判断是否存在一个key
我们可以使用map[key]的方法来获取该key的值,同时我们还可以接受一个boolean类型的标识来判断该值是否存在
func main() {
m1 := make(map[string]int, 10)
m1["a"] = 1
m1["b"] = 2
var v, ok = m1["c"]
if ok {
fmt.Println("m1[\"c\"] =", v)
} else {
fmt.Println("不存在的key")
}
}

map的遍历
map的遍历可以使用for range进行遍历
func main() {
m1 := make(map[string]int, 10)
m1["a"] = 1
m1["b"] = 2
m1["c"] = 3
for k, v := range m1 {
fmt.Printf("m[\"%v\"] = %v\t", k, v)
}
fmt.Println("")
}

对map进行排序
map底层是用哈希表存储的,所以默认是无序的,对他进行排序只能讲他的key或者value取出存入一个切片中,然后对切片进行排序后再通过切片的顺序对map进行输出
package main
import (
"fmt"
"math/rand"
"sort"
)
func main() {
sourceMap := make(map[int]string, 100)
for i := 0; i < 20; i++ {
key := rand.Intn(1000)
value := fmt.Sprintf("Stu%d", rand.Intn(100))
sourceMap[key] = value
}
for k, v := range sourceMap {
fmt.Printf("map[%v]=%v\t", k, v)
}
fmt.Println("")
fmt.Println("-----------------------------------")
key := make([]int, 0, 100)
for k := range sourceMap {
key = append(key, k)
}
sort.Ints(key)
for _, v := range key {
fmt.Printf("map[%v]=%v\t", v, sourceMap[v])
}
}

元素为map类型的切片
切片和map都需要通过make函数来分配内存空间
// map类型的切片
func main() {
slice := make([]map[int]string, 10, 100)
for i := range slice {
slice[i] = make(map[int]string, 10)
}
slice[0][1] = "你好"
slice[1][2] = "嗨咯"
fmt.Println(slice)
}

元素为切片类型的map
切片和map都需要通过make函数来分配内存空间
package main
import "fmt"
func main() {
m := make(map[string][]string, 10)
m["一号切片"] = make([]string, 3)
m["一号切片"][0] = "Good morning"
m["一号切片"][1] = "Good afternoon"
m["一号切片"][2] = "Good evening"
m["一号切片"] = append(m["一号切片"], "Good night")
fmt.Println(m)
}

练习
统计一句句子中单词出现的次数



浙公网安备 33010602011771号