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 ", a)//连数据类型和数据都显示 fmt.Printf("type:%T ", 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 ", 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 格式化输出。