Golang实现通讯录小案例

阅读 94

2022-02-02

代码:

package main

import "fmt"

func main() {
	for {
		menu()
	}
}

type User struct {
	userName string
	/**
	key:表示电话的类型
	value:电话号码
	*/
	addressPhone map[string]string
}

// 定义切片
var userList = make([]User, 0)

func menu() {

	// 1、给出提示
	fmt.Println("添加联系人信息,请按1")
	fmt.Println("删除联系人信息,请按2")
	fmt.Println("编辑联系人信息,请按3")
	fmt.Println("查看联系人信息,请按4")
	fmt.Println("退出,请按5")
	fmt.Println("--------------------")
	// 2、对用户输入的数字进行判断
	var num int
	fmt.Scan(&num)

	switch num {
	// 添加
	case 1:
		addUser()
	// 删除
	case 2:
		deleteUser()
	// 编辑
	case 3:
		editUser()
	// 查看
	case 4:
		findUser()
	case 5:
		break 
	}
}

func addUser() {
	// 1、添加
	var name string
	var phoneType string
	var phone string
	var exit string
	var userPhone = make(map[string]string)

	fmt.Println("请输入姓名:")
	fmt.Scan(&name)

	for {
		// 2、保存电话类型
		fmt.Println("请输入电话类型:")
		fmt.Scan(&phoneType)

		// 3、保存电话号码
		fmt.Println("请输入电话号码:")
		fmt.Scan(&phone)

		// 4、把电话以及电话类型存储到userPhone中
		userPhone[phoneType] = phone

		fmt.Println("结束录入输入Q")
		fmt.Scan(&exit)

		if exit == "Q" {
			break
		} else {
			continue
		}
	}
	// 5、将联系人的信息添加到切片中
	userList = append(userList, User{userName: name, addressPhone: userPhone})
	fmt.Println("添加成功")
}

/**
查询联系人
*/
func showUser() {
	// 1、判断切片中是否有数据
	if len(userList) == 0 {
		fmt.Println("通讯录为空,请先添加联系人")
	} else {
		for _, value := range userList {
			fmt.Println("姓名:", value.userName)
			for key, v := range value.addressPhone {
				fmt.Println("电话类型:", key)
				fmt.Println("电话号码:", v)
			}
		}
	}
}

/**
删除信息
*/
func deleteUser() {
	// 1、根据联系人姓名删除,判断切片中是否有要删除的联系人
	var name string
	index := -1
	fmt.Println("请输入要删除联系人的姓名:")
	fmt.Scan(&name)

	// 2、记录要删除联系人的的索引
	for i := 0; i < len(userList); i++ {
		if userList[i].userName == name {
			index = i
			break
		}
	}
	// 3、执行删除操作
	/**
	从0索引截取到userList[:index],但是不算index
	从index+1索引截取到末尾,因为不算index所以要+1
	append,相当于做了一个拼接把第二个参数追加到第一个参数后面,但是如果第二个参数是一个切片,需要加三个点
	*/
	if index != -1 {
		userList = append(userList[:index], userList[index+1:]...)
	}
	showUser()
}

func findUser() *User {
	// 1、根据联系人姓名查询,判断切片中是否有要查询的联系人
	var name string
	index := -1
	fmt.Println("请输入要查询联系人的姓名:")
	fmt.Scan(&name)

	for key, value := range userList {
		if value.userName == name {
			index = key
			fmt.Println("联系人姓名", value.userName)
			for k, v := range value.addressPhone {
				fmt.Printf("%s:%s\n", k, v)
			}
		}
	}
	if index == -1 {
		fmt.Println("没有查询到该联系人")
		return nil
	} else {
		return &userList[index]
	}
}

func editUser() {
	// 1、添加
	var name string
	var user *User
	var num int
	menu := make([]string, 0) // 保存电话类型
	var userNum int
	var newPhone string

	user = findUser()
	if user != nil {
		for {
			fmt.Println("编辑用户名称请按1,编辑用户电话请按2,退出请按3")
			fmt.Scan(&num)

			switch num {
			case 1:
				fmt.Println("请输入新的用户姓名:")
				fmt.Scan(&name)
				user.userName = name
				showUser()
			case 2:
				// 显示联系人所有的电话信息
				var n int
				for key, value := range user.addressPhone {
					fmt.Println("编辑(", key, ")", value, "请按:", n)
					menu = append(menu, key)
					n++
				}
				// 修改
				fmt.Println("请输入编辑号码的类型:")
				fmt.Scan(&userNum)

				for key, value := range menu {
					if key == userNum {
						fmt.Println("请输入新的电话号码:")
						fmt.Scan(&newPhone)
						user.addressPhone[value] = newPhone
					}
				}
			case 3:
				break
			}
			break
		}
	} else {
		fmt.Println("没有查询到要编辑的联系人")
	}
}

精彩评论(0)

0 0 举报