1. 用户管理功能
定义全局变量users := []map[string]string{}
每个元素
- ID
- 名称
- 联系方式
- 通信地址
1. 增加
add
函数- 从命令行分别输入名称、联系方式、通信地址
- 生产ID => 查找
users
中最大的id+1(无元素id=1) - 放入
users
-
2. 删除
del
函数- 从命令行中输入要删除的用户ID
- 验证ID是否存在,如果存在,打印需要删除用户信息
- 并让用户输入y/n确认是否删除
- 输入y删除用户信息
3. 修改
modify
函数- 从命令行输入要修改的用户ID
- 验证ID是否存在,如果存在,打印所需要删除用户信息
- 并让用户输入
y/n
确认是否修改 - 输入
y
修改用户信息,继续让从命令行分别输入 - 用户名,联系方式,地址 进行更新
4. 查找
- query函数
- 从命令行输入要查询的字符串
- 遍历比较用户的名称,地址,联系方式,包含要查找的字符进行 ```go package main
import ( “crypto/md5” “fmt” “strconv” “strings” )
var users []map[string]string var passwd = “E10ADC3949BA59ABBE56E057F20F883E”
// init 信息初始化 func init() { for i := 1; i <= 3; i++ { users = append(users, map[string]string{ “id”: fmt.Sprintf(“%d”, i), “name”: fmt.Sprintf(“name%d”, i), “addr”: fmt.Sprintf(“addr%d”, i), “tel”: fmt.Sprintf(“tel_%d”, i), }) } }
func input(base string) string { fmt.Print(base) fmt.Scan(&base) return base }
// GetId 获取id序号 func GetId() string { // []int 最大的元素 id := 0 for _, user := range users { if uid, err := strconv.Atoi(user[“id”]); err == nil { if uid > id { id = uid } } } return strconv.Itoa(id + 1) }
// AddUser 用户添加模块 func AddUser() { user := map[string]string{ “id”: GetId(), “name”: input(“请输入名称:”), “addr”: input(“请输入地址:”), “tel”: input(“请输入联系方式:”), } users = append(users, user) fmt.Println(users) }
// filter 遍历字符串进行包含查找 func filter(user map[string]string, q string) bool { return strings.Contains(user[“id”], q) || strings.Contains(user[“name”], q) || strings.Contains(user[“addr”], q) || strings.Contains(user[“tel”], q) }
// PrintUsers 打印格式 func PrintUsers(user map[string]string) { fmt.Println(user) }
// QueryUser 信息查询模块 func QueryUser() { q := input(“请输入查询的信息:”) for _, user := range users { if filter(user, q) { PrintUsers(user) } } }
// FindUserByid 查找删除的ID func FindUserByid(id string) map[string]string { for _, user := range users { if user[“id”] == id { return user } } return nil }
// DeleteUserByid 删除不需要的id func DeleteUserByid(id string) { // 方法1: // 把不需要删除 => 定义新的切片 => users tempUsers := make([]map[string]string, 0, len(users)-1) for _, user := range users { if user[“id”] != id { tempUsers = append(tempUsers, user) } } users = tempUsers
}
// DeleteUser 删除模块 func DeleteUser() { id := input(“请输入需要删除的ID:”) user := FindUserByid(id) if user == nil { fmt.Println(“用户不存在”) } else { fmt.Println(“您将要删除的用户信息如下:”) fmt.Println(user) confirm := input(“是否需要删除以上用户?(Y/N):”) if strings.ToLower(confirm) == “y” || strings.ToLower(confirm) == “yes” { DeleteUserByid(id) // 方法2: // index => append([:n],[n+1:]) // copy } } }
func modifyUserById(user map[string]string, id string) { for idx, tuser := range users { if tuser[“id”] == id { users[idx] = user break } } }
// ModifyUser 修改用户模块 func ModifyUser() { id := input(“请输入需要修改的ID:”) user := FindUserByid(id) if user == nil { fmt.Println(“用户不存在”) } else { fmt.Println(“您将要修改的用户信息如下:”) fmt.Println(user) confirm := input(“确认修改用户?(Y/N):”) if strings.ToLower(confirm) == “y” || strings.ToLower(confirm) == “yes” { user := map[string]string{ “id”: id, “name”: input(“请输入new名称:”), “addr”: input(“请输入new地址:”), “tel”: input(“请输入new联系方式:”), } modifyUserById(user, id) } } }
func testmd5(text string) string { return fmt.Sprintf(“%X”, md5.Sum([]byte(text))) }
func auth() bool { for i := 2; i >= 0; i— { if testmd5(input(“请输入您的密码:”)) == passwd { return true }else { fmt.Println(“输入密码错误,请重新输入(剩余”,i,”次机会)”) } } return false }
func main() { // 定义存储用户的切片 // 每个元素为一个用户 // 用户包含多个属性,用户使用映射存储 // key string,value string if !auth() { fmt.Println(“密码输入错误,退出程序”) return } operates := map[string]func(){ “add”: AddUser, “modify”: ModifyUser, “query”: QueryUser, “delete”: DeleteUser, } for { text := input(“请输入指令:”) if text == “exit” { fmt.Println(“退出”) break } if op, ok := operates[text]; ok { op() } else { fmt.Println(“指令错误”) } }
//AddUser()
//QueryUser()
//ModifyUser()
//DeleteUser()
//fmt.Println(users)
}
<a name="DjTqL"></a>
# 2. 菜单写法
<a name="y6Tl2"></a>
## 1. switch写法
```go
exit:
for {
i := input("请输入您需要进行的操作:")
switch i {
case "add":
fmt.Println("添加")
case "modify":
fmt.Println("执行修改")
case "delete":
fmt.Println("删除")
case "query":
fmt.Println("查询")
case "exit":
fmt.Println("退出")
break exit
default:
fmt.Println("输入指令错误")
}
}
2. 映射写法
operates := map[string]func(){
"add": AddUser,
"modify": ModifyUser,
"query": QueryUser,
"delete": DeleteUser,
}
for {
text:= input("请输入指令:")
if text == "exit"{
fmt.Println("退出")
break
}
if op,ok:=operates[text];ok{
op()
}else {
fmt.Println("指令错误")
}
}