1.map

  • map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。map如果不做初始化,它就是个nil
  • map定义:
  • Go语言中map的定义语法:
map[keytype]ValueType
  • 其中:
  • keyType 表示键的类型
  • ValueType表示键对应的值的类型
  • 初识map:
package main

import "fmt"

//map(映射)
func main() {
	//键是字符串类型,值是int类型
	//只是声明map类型,但是没有初始化,没有初始化默认a就是初始值nil
	var a map[string]int
	fmt.Println(a == nil)//true
	//map的初始化
	a = make(map[string]int, 8)
	fmt.Println(a == nil)//false
    fmt.Println(a)//map[]
}
  • map中添加键值对
package main

import "fmt"

//map(映射)
func main() {
	//map的初始化
    a := make(map[string]int, 8)
	//map中如何添加键值对
	a["皮城女警"] = 150
	a["赏金猎人"] = 200
	fmt.Println(a)
	fmt.Printf("a:%#v\n", a)//连数据类型和数据都显示
	fmt.Printf("type:%T\n", a)
}

// map[皮城女警:150 赏金猎人:200]
// a:map[string]int{"皮城女警":150, "赏金猎人":200}   
// type:map[string]int
  • 声明map的同时完成初始化
package main

import "fmt"

//map(映射)
func main() {
	//声明map的同时完成初始化
	b := map[int]bool{
		1: true,
		2: false,
	}
	fmt.Printf("b:%#v\n", b)
	fmt.Printf("type:%T", b)
	
}
//b:map[int]bool{1:true, 2:false}
	//type:map[int]bool
  • 判断 值是否在map中
//map(映射)
package main

import "fmt"


func main() {
	//判断某个键存不存在
	var scoreMap = make(map[string]int, 8)
	scoreMap["小明"] = 99
	scoreMap["小红"] = 89
	//判断 小刚  在不在scoreMap中
	v, ok := scoreMap["小刚"]
	fmt.Println(v, ok)// 0 false
	if ok {
		fmt.Println("小刚在scoreMap中")
	} else {
		fmt.Println("查无此人") // 查无此人
	}

}
  • map的遍历(使用for...range)
  • map是无序的,键值对和添加的顺序无关
package main

import "fmt"

//map(映射)
func main() {
	//map的遍历
	var scoreMap = make(map[string]int, 8)
	scoreMap["小明"] = 99
	scoreMap["小红"] = 89
	scoreMap["小刚"] = 65
	//for range遍历
	for k, v := range scoreMap {
		fmt.Println(k, v)
	}
    //只遍历key
    for k := range scoreMap {
		fmt.Println(k)
	}
    //只遍历value
    for _, v := range scoreMap {
		fmt.Println(v)
	}
    

}
//小刚 65
//小明 99
//小红 89
  • 使用delete函数删除map键值对
package main

import "fmt"

//map(映射)
func main() {
	var scoreMap = make(map[string]int, 8)
	scoreMap["小明"] = 99
	scoreMap["小红"] = 89
	scoreMap["小刚"] = 65
	//删除小刚 这个键值对
	delete(scoreMap, "小刚")
	fmt.Println(scoreMap)

}
  • 按照key从小到大的顺序去遍历scoreMap
package main

import "fmt"
import "sort"
import "math/rand"
//map(映射)
func main() {	
	var scoreMap = make(map[string]int, 100)
	//添加50个键值对
	for i := 0; i < 50; i++ {
		key := fmt.Sprintf("stu%02d", i)
		value := rand.Intn(100) //0-99随机整数
		scoreMap[key] = value
	}
	// for key, value := range scoreMap {
	// 	fmt.Println(key, value)
	// }
	//按照key从小到大的顺序去遍历scoreMap
	//1.先取出所有的key,存放到切片中
	keys := make([]string, 0, 100)
	for k := range scoreMap {
		keys = append(keys, k)
	}
	//2.对key做排序
	sort.Strings(keys) //keys是一个有序的切片
	//3.按照排序后的key对应scoreMap排序
	for _, key := range keys {
		fmt.Println(key, scoreMap[key])
	}
}
  • 元素为map的切片
package main

import "fmt"

//map(映射)
func main() {
	
	//元素为map的切片
	var mapSlice = make([]map[string]int, 8, 8) //只完成了切片的初始化,没有完成map的初始化
	//还需要完成内部map的元素初始化
	mapSlice[0] = make(map[string]int, 8) //完成切片第一个map初始化
	mapSlice[0]["xjk"] = 100
	fmt.Println(mapSlice)
}
  • 值为切片类型的map
package main

import "fmt"

//map(映射)
func main() {
	//值为切片的map
	var sliceMap = make(map[string][]int, 8) //只完成了map的初始化
	v, ok := sliceMap["中国"]
	if ok {
		fmt.Println(v)
	} else {
		//sliceMap中没有中国这个键
		sliceMap["中国"] = make([]int, 8) //完成了对切片的初始化
		sliceMap["中国"][0] = 100
		sliceMap["中国"][1] = 200
		sliceMap["中国"][2] = 300
	}
	fmt.Println(sliceMap)
	//遍历sliceMap
	for k, v := range sliceMap {
		fmt.Println(k, v)
	}

}
  • 练习题:统计一个字符串中每个单词出现的次数
package main

import (
	"fmt"
	"strings"
)

//map(映射)
func main() {

	//统计一个字符串中每个单词出现次数
	//"how do you do"中每个单词出现次数
	temp := "how do you do"
	//定义一个map[string]int
	var wordCount = make(map[string]int, 10)
	//字符串中都有哪些单词
	words := strings.Split(temp, " ")
	//遍历单词做统计
	for _, word := range words {
		v, ok := wordCount[word]
		if ok {
			wordCount[word] = v + 1
		} else {
			wordCount[word] = 1
		}
	}
	for k, v := range wordCount {
		fmt.Println(k, v)
	}
   // Printf 格式化输出。