利用Golang的基础知识实现通讯录案例,主要功能有增、删、改、查。涉及到的知识有:函数调用、结构体、切片、map、指针、append函数等等。以下代码可以直接运行。
通讯录案例介绍
界面展示、添加联系人信息、删除联系人信息、查询联系人信息、编辑联系人信息
界面展示功能
定义结构体和切片:结构体有两个成员变量表示联系人信息,addressPhone定义为map类型用于存储电话类型和电话号码。定义切片用于存储结构体类型的实例,保存多个联系人信息。
//定义结构体
type Person struct {
userName string
addressPhone map[string]string//key:表示电话的类型。value:电话
}
//切片
var personList = make([]Person,0)
界面展示:主函数死循环。
func main() {
for {//死循环
scanNum()
}
}
func scanNum(){
//1.给出相应的操作提示
fmt.Println("添加联系人信息,请按1")
fmt.Println("删除联系人信息,请按2")
fmt.Println("查询联系人信息,请按3")
fmt.Println("编辑联系人信息,请按4")
//2.对用户输入的数字进行判断
var num int//保存用户输入的数字
fmt.Scan(&num)
switchType(num)
}
//对输入的内容进行判断,决定执行哪块操作
func switchType(n int) {
switch n {
case 1:
//添加联系人的操作
addPerson()
case 2:
//删除联系人的操作
removePerson()
case 3:
//查询联系人的操作
findPersion()
case 4:
//编辑联系人的操作
editPersion()
}
}
保存联系人信息
//添加联系人
func addPerson() {
//1.定义结构体表示联系人信息
//2.定义切片保存多个人的联系信息
//3.向切片中保存数据
//3.1添加姓名
var name string
var address string
var phone string
var exit string//表示退出电话的录入
var addressPhone = make(map[string]string)//保存电话的类型和电话,电话类型作为key
fmt.Println("请输入姓名")
fmt.Scan(&name)
for {//死循环
//3.2保存电话类型
fmt.Println("请输入电话类型(公司,学校):")
fmt.Scan(&address)
//3.3保存电话号码
fmt.Println("请输入电话号码:")
fmt.Scan(&phone)
//将电话以及电话类型存储到addressPhone中
addressPhone[address] = phone
fmt.Println("如果结束电话的录入,请按Q")
fmt.Scan(&exit)
if exit=="Q" {
break
}else {
continue
}
}
//将联系人的信息存储到切片中
personList = append(personList,Person{userName:name,addressPhone: addressPhone})
//fmt.Println(personList)
showPersonList()//调用函数展示联系人的信息
}
展示保存的联系人的信息
//展示切片中存储的联系人信息
func showPersonList() {
//1.判断一下切片中是否有数据
if len(personList)==0 {
fmt.Println("暂时没有联系人信息")
}else {
for _,value:=range personList{//结构体
fmt.Println("姓名",value.userName)
//遍历map
for k,v:=range value.addressPhone{
fmt.Println("电话类型:",k)
fmt.Println("电话号码:",v)
}
}
}
//2.可以通过循环的方式打印切片中的数据
}
删除联系人信息
//删除联系人信息
func removePerson() {
//1.输入要删除的联系人的姓名
var name string
var index int = -1//记录要删除的联系人信息在切片中的下标
fmt.Println("请输入要删除联系人的姓名")
fmt.Scan(&name)
//2。判断切片中是否存储了要删除的联系人信息
for i:=0;i<len(personList);i++{
if personList[i].userName==name {
index = i
break
}
}
//3.记录要删除的联系人信息在切片中的位置(下标)
//4.删除操作
//5 6 7 8 9 10 11 12 截取index = 3
//[:index] 5 6 7
//[index+1:]9 10 11 12
if index!=-1 {
personList=append(personList[:index],personList[index+1:]...)//append函数第二个参数如果是切片后面要跟三个点
}
showPersonList()
}
查找联系人信息
//查找联系人信息
func findPersion() *Person {
//1.输入要查询的联系人姓名
var name string
var index int = -1//记录找到的联系人信息在切片中的下标
fmt.Println("请输入要查询的联系人的姓名:")
fmt.Scan(&name)
//2.根据输入的联系人姓名,查找对应的联系信息
for k,value := range personList{
if value.userName==name {
index = k
fmt.Println("联系人姓名:",value.userName)
for key,v :=range value.addressPhone{
fmt.Printf("%s:%s\n",key,v)
}
}
}
//3.打印输出结果
if index==-1 {
fmt.Println("没有找到联系人信息")
return nil
}else {
return &personList[index]
}
}
编辑联系人信息
//编辑联系人信息
func editPersion() {
//1.查找到要编辑的联系人信息
var name string//存储新的联系人姓名
var p *Person
var num int//存储修改数据的类型
var menu = make([]string,0)//定义切片,保存电话类型,方便后面修改
var pNum int//编辑的电话类型编号
var phone string//新的电话号码
p = findPersion()
if p != nil {
for {
fmt.Println("编辑用户名称请按:5,编辑电话请按:6,退出请按:7")
fmt.Scan(&num)
switch num {
case 5:
fmt.Println("请输入新的姓名:")
fmt.Scan(&name)
p.userName = name
showPersonList()
case 6:
//编辑联系电话
//1.展示联系人所以的电话信息
var j int
for key,value := range p.addressPhone{
fmt.Println("编辑(",key,")",value,"请按:",j)//key是电话类型,value是电话号码
menu = append(menu,key)
j++
}
fmt.Println("请输入编辑号码的类型:")
fmt.Scan(&pNum)
for index,v := range menu {
if index==pNum{
fmt.Println("请输入新的电话号码:")
fmt.Scan(&phone)
p.addressPhone[v] = phone//map更新
}
}
//2.完成修改
}
if num==7 {
break
}
}
}else {
fmt.Println("没有找到要编辑的联系人的信息")
}
//2.进行编辑
}
程序运行结果
添加联系人信息
编辑联系人信息
删除联系人信息
查询联系人信息