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)
}

练习

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

posted @ 2021-01-29 11:50  FarajMujey  阅读(99)  评论(0)    收藏  举报