开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map:map综合应用实例】与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9663
map 综合应用实例
内容介绍:
一、课堂练习的要求
二、案例演示
三、注意
一、课堂练习的要求
来看一下 map 的课堂练习,这个练习相对来说综合一点,使用到map的各个方面的知识点,那么来看一下这个课堂练习的要求是什么。
1.使用 map[string]map[string]string 的 map 类型。
2.key:表示用户名,是唯一的,不可以重复。
3.如果某个用户名存在,就将其密码修改"888888",如果不存在就增加这个用户信息,(包括昵称nickname和密码pwd)。
4.编写一个函数modifyUser(users map[string]map[string]string,name string)完成上述功能。
第一个首先它说使用 map,map[string]map[string]这是一个 map,key 为string,值为 map[string]string 又是一个 map。
第二个 key 表示用户名,是唯一的,不可以重复。也就是说这个 key string 表示用户名,唯一且不可重复。
第三个也就是说 map[string]string 的值里面应该怎么保存用户信息,里面应该有它的昵称和密码,应该有两对 key value。
第四个要求写一个 modifyUser 函数,modifyUser 可以接收两个参数:一个是map 本身,另一个是传一个名字进去完成上述功能。简单的说也就是传一个用户名name 进去,然后判断 map 里面有没有 users,如果有就把密码改为“888888”,如果没有就增加这个用户信息。
二、案例演示
代码实现:
在 chapter09里面新建一个文件夹叫 exercise,在此内新建一个 文件叫 main.go,从上一份文件里粘贴一份通用的代码过来,代码如下:
package main
import (
“fmt”
)
func main() {
}
然后在主函数里定义一个 map[string]map[string]string 这样的 map:
func main() {
users
:= make(map[string]map[string]string, 10)
//假设 make10个这样的类型,但它的值还是 map
modifyUser(users, “tom”)
//把users传递进主函数里
}
再写一个函数:
func
modifyUser(users map[string]map[string]st
r
ing,name string){
//首先users会传递进主函数,生成名字
//判断users中是否有name
//v
, ok := users[name]
//判断v这个值,users 里有没有叫 name 的 key,通过 ok 来判断。这个判断有点麻烦,也是可以用的,但是这里用简单一点。
if users[name] != ni1{
//如果它的这个名字,users 的 map 里有这个用户了,那么它就会不等于 ni1,如果没有就会等于 ni1。
//有这个用户
users[
name][“pw
d
”] = “888888”
//根据要求,用户名存在,密码就改为“888888”。假设密码的这个key也就是map[string]string,用户的信息其中有个 key 叫做 password。
} else {
//没有这个用户
/
/
创建这个用户
users[
name] = make(map[string]string
,
2) //第一步应该先 make 出对应的 map,至少有两对 key value。
users[name][“pwd”] = “888888”
/
/
密码就是“8
88888”
users[name][“nickname”] = “
昵称~
”+ name //
示意
//按理说应该传一个昵称过来,但是没有传,所以这里把名字加个名称做昵称名字,是示意代码
//如果想做好一点就在 modify 函数后面加一个 nickname string,这样昵称就被传过来了,在创建用户的时候直接写就可以了。
}
}
把 users 传递进主函数里:
modifyUser(users, “tom”)
modifyUser(users, “
mary
”)
//再加一个 mary
fmt
.Println(users)
//输出这个函数
//因为 users 是一个 map,所以它是引用传递,里面的修改会直接影响到外面的修改,users 也会变化。
执行这个代码。
在 cmd.exe 里输入以下命令回车:
cd
..
c
d exercise
g
o run main.go
输出:
map
[tom:map[pwd:888888] nickname:
昵称~tom
]
mary
:map[pwd:888888 nickname:
昵称~mary]
]
可以看到在这个 map 里就有了一个 tom,tom 这个人的信息密码是“888888“,昵称是 tom;第二个是 mary,他的信息是一个 map,密码是“888888”,昵称是 mary。和代码完全正确。
当然如果在事先放了一个 map 进去,那么就会直接改密码不改昵称了。比如在主函数中加一个用户:
users[
“smith”] = make(map[string]string, 2)
//因为 smith 的值对应的 map,所以也要先 make 一下,也是2个信息。
users[“smith”][“pwd”] = “999999”
//假设smith的密码是“999999“
users[“smith”]
[
“nickname”] = “
小花猫
” “
昵称~
”
+
name
//示意
再传一个用户为 smith:
modify
U
ser(
users, “mary”)
那么运行时就会走if分支有这个用户的路径,smith 的密码就会变成“888888”,同时smith的昵称不会发生变化。运行一下可以得出:
map[tom:map[pwd:888888 nicknane:昵称
~
tom] mary:map[pwd:88888 nickname:
昵称
~mary] smith:map[pwd:888888nickname:小花猫]]
可以看到smith的密码被修改为“888888”了,同时它的昵称并没有发生变化,说明代码是正确的,走的是if的这个分支,而不是 else 这个分支。
三、注意
到此就把 map 的各个方面介绍完了,在后面写爬虫、流量统计的这种项目的时候都会用到 map 的相关信息,尤其是以上所讲解的这块 map,如果里面值还是 map的话,一定要清楚 make 两次,这是初学 golang 的时候容易经常犯的错误,要重视。下一个章节开始介绍 golang 里面的面向对象编程或者叫面向接口编程。