Golang实现通讯录小案例

代码:

package mainimport "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 intfmt.Scan(&num)switch num {// 添加case 1:addUser()// 删除case 2:deleteUser()// 编辑case 3:editUser()// 查看case 4:findUser()case 5:break }
}func addUser() {// 1、添加var name stringvar phoneType stringvar phone stringvar exit stringvar 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] = phonefmt.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 stringindex := -1fmt.Println("请输入要删除联系人的姓名:")fmt.Scan(&name)// 2、记录要删除联系人的的索引for i := 0; i < len(userList); i++ {if userList[i].userName == name {index = ibreak}}// 3、执行删除操作/**从0索引截取到userList[:index],但是不算index从index+1索引截取到末尾,因为不算index所以要+1append,相当于做了一个拼接把第二个参数追加到第一个参数后面,但是如果第二个参数是一个切片,需要加三个点*/if index != -1 {userList = append(userList[:index], userList[index+1:]...)}showUser()
}func findUser() *User {// 1、根据联系人姓名查询,判断切片中是否有要查询的联系人var name stringindex := -1fmt.Println("请输入要查询联系人的姓名:")fmt.Scan(&name)for key, value := range userList {if value.userName == name {index = keyfmt.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 stringvar user *Uservar num intmenu := make([]string, 0) // 保存电话类型var userNum intvar newPhone stringuser = findUser()if user != nil {for {fmt.Println("编辑用户名称请按1,编辑用户电话请按2,退出请按3")fmt.Scan(&num)switch num {case 1:fmt.Println("请输入新的用户姓名:")fmt.Scan(&name)user.userName = nameshowUser()case 2:// 显示联系人所有的电话信息var n intfor 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("没有查询到要编辑的联系人")}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql5.6版修改用户登录密码

1、使用 mysqladmin 方式: 打开命令提示符界面, 执行命令: mysqladmin -u root -p password 新密码 执行后提示输入旧密码完成密码修改, 当旧密码为空时直接按回车键确认即可。 2、UPDATE user 语句&#xff08;我自己用的就是这个方法&#xff09; 这种方式必须是先用root帐户…

Go_面向对象(抽象、封装、继承)

抽象 抽象是一种编程思维方式&#xff0c;是从多个事物中提取共性 例&#xff1a;产品经理和程序员都有工作的方法&#xff0c;但是工作内容不同&#xff0c;可以把工作抽象出来定义为一个方法&#xff0c;具体细节由调用者补充 银行存取款案例&#xff1a; 账号结构体取款方法…

Go_接口、多态、接口继承与转换、空接口、类型断言

接口 接口用于定义对象的行为&#xff0c;接口只指定对象应该做什么&#xff0c;实现这种行为由对象来决定。接口只是把所有具有共性的方法定义在一起&#xff0c;任何类型实现了接口中所有的方法&#xff0c;就是实现了这个接口。接口存在的意义就是用来定义规范&#xff0c;…

Discrete Logging POJ - 2417(BSGS)

Discrete Logging POJ - 2417 题意&#xff1a;给P&#xff0c;B&#xff0c;N&#xff0c;求最小的L使得 BL≡N (mod P)&#xff0c;其中P是素数。 Baby Step Giant Step 1 #include <cstdio>2 #include <cstring>3 #include <iostream>4 #include <cma…

Go_error处理及panic、recover使用的正确姿势

异常 异常就是程序出现了不正常的情况&#xff0c;会导致程序非正常停止&#xff0c;而异常处理就是针对非正常停止的情况&#xff0c;给出异常时的处理方式。语法错误不算异常体系中 error&#xff1a; error是一个接口&#xff0c;作用是返回程序异常的信息&#xff0c;err…

js 根据固定位置获取经纬度--腾讯地图

1.首先引入jq 和 腾讯地图js <script src"../js/jQuery.js"></script> <script charset"utf-8" src"http://map.qq.com/api/js?v2.exp"></script> 2.html代码部分 <body onload"init()"><button ty…

Go_文件/目录创建、写入、追加、读取、缓冲区、Stat、IsNotExist、Copy

操作目录 创建目录 Mkdir&#xff1a;创建单个目录MkdirAll&#xff1a;创建多级目录 func main() {err : os.Mkdir("/Users/itzhuzhu/Desktop/笔记/英语/a", os.ModePerm)if err ! nil {fmt.Println("创建失败", err)} else {fmt.Println("创建成…

【bzoj3343】教主的魔法 (分块 + 二分)

传送门(权限题) 题目分析 题意为&#xff1a;给定一个数列&#xff0c;修改和查询两种操作&#xff0c;修改每次给定一个区间&#xff0c;区间的所有元素都加上一个给定值&#xff0c;查询询问一段区间的数权值大于等于给定值的数有多少个。 首先对原序列分块&#xff0c;然后将…

Golang——string字符串常用函数(Contains、join、Index、Repeat、Replace、Split、Trim、Fields)

更多的还是去官方文档里去看&#xff1a;https://studygolang.com/pkgdoc Contains&#xff1a; 判断字符串中是否包含指定字符串 演示&#xff1a; func main() {str1 : "itzhuzhu"result : strings.Contains(str1, "zhu")fmt.Println(result) }join&a…

[flask 优化] 由flask-bootstrap,flask-moment引起的访问速度慢的原因及解决办法

一周时间快速阅读了400页的《javascript基础教程》&#xff0c;理解了主要概念。解决了一个很久之前的疑问。 我的网站是使用flask框架搭建的&#xff0c;介绍flask web的一本著名的书&#xff08;之前提到过&#xff09;作者搭建个人博客时&#xff0c;向读者推荐了flask-boot…

Go_关键字、编译、转义字符

关键字&#xff1a; 关键字是指被go语言赋予了特殊含义的单词&#xff0c;共25个&#xff0c;关键字不能用于自定义名字&#xff0c;只能在特定语法结构中使用。 breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstfallthroughifrangetypec…

NFS服务配置

NFS会经常用到&#xff0c;用于在网络上共享存储。举一个例子来说明一下NFS是用来做什么的。假如有三台机器A, B, C&#xff0c;它们需要访问同一个目录&#xff0c;目录中都是图片&#xff0c;传统的做法是把这些图片分别放到A, B, C. 但是使用NFS只需要放到A上&#xff0c;然…

Go_数据类型转换(Sprintf、Format、Append方式转换)

数据类型转换&#xff1a; 类型转换是将一种数据类型的变量转为另一种类型的变量Go强制要求使用显式类型转换。所以语法更能确定语句及表达式的明确含义转换的时候如果大的转给小的&#xff0c;会有精度损失&#xff08;数据溢出&#xff09;比如int64转int8 转换格式&#xff…

Mybayis的项目使用的Mapping文件使用总结参考(一)

作者:longgangbai 以前用过ibatis2,但是听说ibatis3有较大的性能提升&#xff0c;而且设计也更合理&#xff0c;他不兼容ibatis2.尽管ibatis3还是beta10的状态&#xff0c;但还是打算直接使用ibatis3.0, ibatis3.0应该更简单高效.最近还自己写了个ibatis3.0与spring集成的bean&…

并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

多线程&#xff1a; 多线程就是同时执行多个应用程序&#xff0c;需要硬件的支持同时执行&#xff1a;不是某个时间段同时&#xff0c;cpu切换的比较快&#xff0c;所有用户会感觉是在同时运行 并发与并行&#xff1a; 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多…

第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到&#xff0c;在init进程中内核挂接到根文件系统之后&#xff0c;会开始启动第一个应用程序: kernel_init函数代码如下: static int __init kernel_init(void * unused) //进入init进程 …

Golang并发——并发技术Goroutine和channel的使用、定时器、生产者消费者、条件变量、select

Goroutine: goroutine是Go并行设计的核心。goroutine说到底其实就是协程&#xff0c;它比线程更小&#xff0c;十几个goroutine可能体现在底层就是五六个线程&#xff0c;Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB)&#x…

Golang——死锁、互斥锁、读写锁的实现

死锁&#xff1a; 什么是锁呢&#xff1f;就是某个协程&#xff08;线程&#xff09;在访问某个资源时先锁住&#xff0c;防止其它协程的访问&#xff0c;等访问完毕解锁后其他协程再来加锁进行访问。这和我们生活中加锁使用公共资源相似&#xff0c;例如&#xff1a;公共卫生间…

Oozie协作框架

Oozie协作框架 一&#xff1a;概述 1.大数据协作框架 2.Hadoop的任务调度 3.Oozie的三大功能 Oozie Workflow jobs Oozie Coordinator jobs Oozie Bundle 4.Oozie的架构 控制流节点 起始&#xff0c;分支&#xff0c;并发&#xff0c;汇合&#xff0c;结束 动作节点action 5.O…

11.4 专利法与反不正当竞争法解读

第六条是对于职务作品的一个定性.它这个职务作品、职务发明创造和我们前面著作法所讲到的职务作品的处理方式基本一致.就是如果认定某一个作品它是属于职务作品、职务发明创造,那么这一个作品它的专利权应该是属于单位而不是个人.只有认定这个创造为非职务发明创造的时候,申请的…