map的基础用法

map的基本使用 详情参考https://www.liwenzhou.com/posts/Go/08_map/

//map的基本使用
//map类型的变量默认初始值为nil,需要使用make()函数来分配内存
func main() {
	scorceMap := make(map[string]int, 8)
	scorceMap["张三"] = 90                    //向scoreMap中添加一对键值对
	scorceMap["李四"] = 66                    //同上
	fmt.Println(scorceMap)                  //打印现有map中所有的内容
	fmt.Println(scorceMap["张三"])            //打印键为张三对应的值
	fmt.Printf("type of a:%T\n", scorceMap) //打印scorceMap的类型信息
}

输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
map[张三:90 李四:66]
90
type of a:map[string]int

注释:map是引用类型.与channel ,slice,map 都需要使用make进行初始化,进行内存分配.

//声明map的时候直接初始化赋值

//声明map的时候直接填充map内容
func main() {
	userInfo := map[string]int{ //直接使用:= 声明map并对map进行初始化赋值
		"张三": 99,
		"李四": 98,
		"王五": 97,
	}
	fmt.Println(userInfo) //虽然这里使用的是println进行输出.但是打印出的内容是在一行中的.因为打印的map是一个整体.并没有做遍历操作.
}

输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
map[张三:99 李四:98 王五:97]

//判断key是否在map中

//声明map的时候直接填充map内容
func main() {
	userInfo := map[string]int{ //直接使用:= 声明map并对map进行初始化赋值
		"张三": 99,
		"李四": 98,
		"王五": 97,
	}
	fmt.Println(userInfo) //虽然这里使用的是println进行输出.但是打印出的内容是在一行中的.因为打印的map是一个整体.并没有做遍历操作.
	//判断map中是否有某个键值
	value, ok := userInfo["张三"] //在map中取值会返回一个值内容,和一个bool值.如果成功返回key内容那么bool值就是true.否则就是false
	if ok {
		fmt.Println("张三:", value)
	} else {
		fmt.Println("张三不存在")
	}
}

输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup

Process finished with exit code 0
map[张三:99 李四:98 王五:97]
张三: 99

遍历map

//遍历map
func main() { //遍历键值,
	scoreMap := map[string]int{
		"张三": 99,
		"张思": 95,
		"张武": 98,
	}
	for k, v := range scoreMap {  //使用range遍历整个键值对.
		fmt.Println(k, v)
	}
}

输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
张三 99
张思 95
张武 98

这里遍历的是整个键值对.

只遍历键或者之遍历值

func main() { //遍历键值,
	scoreMap := map[string]int{
		"张三": 99,
		"张思": 95,
		"张武": 98,
	}
	for k := range scoreMap {
		fmt.Println("scorMap的键为: ", k) //这里只遍历map的所有键.
	}
	for _, v := range scoreMap {
		fmt.Println("scorMap的键为: ", v) //这里只遍历map的所有值,将键舍弃
	}
}

输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
scorMap的键为:  张三
scorMap的键为:  张思
scorMap的键为:  张武
scorMap的键为:  99
scorMap的键为:  95
scorMap的键为:  98

delete()方法删除map中的键值对

//使用delete()删除键值对
//delete(map,key) 这里只要指定删除哪个map中的哪个键
func main() {
	scoreMap := map[string]int{
		"张三":  111,
		"李四":  122,
		"F4":  112,
		"大铁锤": 44,
	}
	fmt.Println(scoreMap)  //打印map
	delete(scoreMap, "F4") //这里将scoreMap中的F4键值对删除,
	fmt.Println(scoreMap)  //打印map
}

输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_main_go.exe #gosetup
map[F4:112 大铁锤:44 张三:111 李四:122]
map[大铁锤:44 张三:111 李四:122]

这里看到第二次打印map的时候里面的元素已经将f4:122删除掉了

map的顺序取值

func main() {
	rand.Seed(time.Now().UnixNano()) //初始化随机数种子

	var scoreMap = make(map[string]int, 200)

	for i := 0; i < 10; i++ {
		key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
		value := rand.Intn(10)           //生成0~99的随机整数
		scoreMap[key] = value
	}
	//取出map中的所有key存入切片keys
	var keys = make([]string, 0, 200)
	for key := range scoreMap {
		keys = append(keys, key)
	}
	//对切片进行排序
	sort.Strings(keys)
	//将切片中的值取出(map中的键)并循环打印出结果
	for _, i := range keys {
		fmt.Println(i, scoreMap[i])
	}
}


输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
stu00 3
stu01 5
stu02 4
stu03 5
stu04 9
stu05 7
stu06 6
stu07 3
stu08 3
stu09 2

元素为map的切片

//元素为map类型的切片
func main() {

	//先声明一个map类型的切片
	scoreMapSlice := make([]map[string]string, 5)
	//定义一个变量item是map类型

	for i := range scoreMapSlice { //将切片里面的元素遍历出来
		scoreMapSlice[i] = make(map[string]string) //表示将所有的元素都定义成map类型
		//修改item的值
		num := fmt.Sprintf("num%2d", i)
		scoreMapSlice[i][num] = fmt.Sprintf("大侠饶命%d", i) //前部部分的scoreMapSlice[i]表示列表中某一个单独的map.
		// [num], 表示这个map的键,
		//如果要给键赋值的话那就表示是一个完整的键值对关系.这个过程是一个直接赋值的过程.

	}
	fmt.Println(scoreMapSlice) //打印完整的map类型的切片

}

输出结果:
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
[map[num 0:大侠饶命0] map[num 1:大侠饶命1] map[num 2:大侠饶命2] map[num 3:大侠饶
命3] map[num 4:大侠饶命4]]

作业1 这道题现在也不明白为啥结果是133

func main() {
	type Map map[string][]int
	m := make(Map)
	s := []int{1, 2}
	s = append(s, 3)
	fmt.Printf("%+v\n", s)
	m["q1mi"] = s
	s = append(s[:1], s[2:]...)
	fmt.Printf("%+v\n", s)
	fmt.Printf("%+v\n", m["q1mi"])
}

输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
[1 2 3]
[1 3]
[1 3 3]

为啥最后的结果是133???
//作业2写一个程序,统计一个字符串中每个单词出现的次数例如 how do you do!
func main() {
	s1 := "how do you do !"     //原始字符串
	m := make(map[string]int)   //初始化一个map类型
	S := strings.Split(s1, " ") //将字符串按照空格为分隔符的形式转换成切片
	for _, v := range S {       //循环切片中的内容,并取出切片中的值(map的键)
		m[v] = m[v] + 1 //每次有相同的map都会+1,因为定义的初始化map中没有值,不太明白为啥map的键相加后值会累积.
	}
	for i, v := range m {
		fmt.Println(i, v) //打印map的键值对
	}
}

输出结果
C:\Users\34826\AppData\Local\Temp\___go_build_code_oldboy_com_studygolang_05lesson5_lesson1.exe #gosetup
! 1
how 1
do 2
you 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值