go语言项目 - 客户信息关系系统
程序员文章站
2022-06-09 18:05:47
学习一门语言最好的方式就是通过一个实际的例子。通过这个实例,不仅可以进一步巩固golang的相关基础技能,同时,也能让我们加强自己的逻辑能力,从一步步的调用函数,掌握参数传递和接收技巧。 项目2 客户信息关系系统 该项目很好的展示了基于面向对象的增删改查功能的实现。 任何一个项目在敲代码之前都要做好 ......
学习一门语言最好的方式就是通过一个实际的例子。通过这个实例,不仅可以进一步巩固golang的相关基础技能,同时,也能让我们加强自己的逻辑能力,从一步步的调用函数,掌握参数传递和接收技巧。
项目2 - 客户信息关系系统
该项目很好的展示了基于面向对象的增删改查功能的实现。
任何一个项目在敲代码之前都要做好需求分析
项目需求分析
-
模拟实现基于文本界面的《客户信息管理软件》
-
该软件能够实现对客户对象的插入,修改和删除(用切片实现),并能够打印客户明细表
项目总体架构
代码区
customer.go
package model import "fmt" //声明一个customer结构体,表示一个客户的必要信息 type customer struct { id int name string gender string age int phone string email string } //使用工厂模式,返回一个customer的实例 func newcustomer(id int, name string, gender string, age int, phone string, email string) customer { return customer{ id: id, name: name, gender: gender, age: age, phone: phone, email: email, } } //第二种创建customer实例方法,不带id func newcustomer2(name string, gender string, age int, phone string, email string) customer { return customer{ name: name, gender: gender, age: age, phone: phone, email: email, } } //返回用户的信息,格式化的字符串 func (cm customer) getinfo() string { info := fmt.sprintf("%v\t%v\t%v\t%v\t%v\t%v\t", cm.id, cm.name, cm.gender, cm.age, cm.phone, cm.email) return info }
customerservice.go
package service import "2020-04-08/customermanage/model" //该customerservice 完成对customer的操作,包括增删改查 type customerservice struct { customers []model.customer //声明一个字段,表示当前切片含有多少个客户 //该字段后面,还可以作为新客户的id + 1 customerid int } //编写一个方法,可以返回*customerservice func newcustomerservice() *customerservice { //为了能够看到有客户在切片中,初始化一个客户 customerservice := &customerservice{} customerservice.customerid = 1 customer := model.newcustomer(1, "紫色飞猪","男",22,"00000000000","zisefeizhu@qq.com") customerservice.customers = append(customerservice.customers, customer) return customerservice } //返回客列表切片 func (cs *customerservice) list() []model.customer { return cs.customers } //添加客户到customers切片 func (cs *customerservice) add(customer model.customer) bool { //确定一个分配id的规则,就是添加的顺序 cs.customerid++ customer.id = cs.customerid cs.customers = append(cs.customers, customer) return true } //根据id查找客户在切片对应下标,如果没有该客户,返回-1 func (cs *customerservice) findbyid(id int) int { index := 1 //遍历cs.customers切片 for i := 0; i < len(cs.customers); i++ { if cs.customers[i].id == id { //找到 index = i } } return index } //删除用户 func (cs *customerservice) delete(id int) bool { index := cs.findbyid(id) //如果index == -1, 说明没有这个客户 if index == -1 { return false } //如何从切片中删除一个元素 cs.customers = append(cs.customers[:index], cs.customers[index+1:]...) return true } func (cs *customerservice) getinfobyid(id int) model.customer { i := id - 1 return cs.customers[i] } //根据id修改客户信息 func (cs *customerservice) update(id int, customer model.customer) bool { for i := 0; i < len(cs.customers); i++ { if cs.customers[i].id == id { cs.customers[i].name = customer.name cs.customers[i].gender = customer.gender cs.customers[i].age = customer.age cs.customers[i].phone = customer.phone cs.customers[i].email = customer.email } } return true }
customerview.go
package main import ( "2020-04-08/customermanage/model" "2020-04-08/customermanage/service" "fmt" ) type customerview struct { //定义必要字段 key string //接受用户输入 loop bool //表示是否循环的显示主菜单 customerservice *service.customerservice } //显示所有的客户信息 func (cv *customerview) list() { //首先,获取到当前的客户信息(在切片中) customers := cv.customerservice.list() //显示 fmt.println("------------------客户列表------------------") fmt.println("编号\t姓名\t性别\t年龄\t电话\t邮箱") for i := 0; i < len(customers); i++ { fmt.println(customers[i].getinfo()) } fmt.println("------------------客户列表------------------") } //得到用户的输入信息构成新的客户,并完成添加 func (cv *customerview) add() { fmt.println("------------------添加客户------------------") fmt.print("姓名:") name := "" fmt.scanln(&name) fmt.print("性别:") gender := "" fmt.scanln(&gender) fmt.print("年龄:") age := 0 fmt.scanln(&age) fmt.print("电话:") phone := "" fmt.scanln(&phone) fmt.print("电邮:") email := "" fmt.scanln(&email) //构建一个新的customer实例 //注意id号,没有让用户输入,id是唯一的,需要系统分配 customer := model.newcustomer2(name, gender, age, phone, email) //调用 if cv.customerservice.add(customer) { fmt.println("------------------添加完成------------------") } else { fmt.println("------------------添加失败------------------") } } //得到用户的输入id,删除该id对应的客户 func (cv *customerview) delete() { fmt.println("------------------删除客户------------------") fmt.print("请选择等待删除客户编号(-1退出):") id := -1 fmt.scanln(&id) if id == -1 { return //放弃删除操作 } fmt.print("确认是否删除(y/n):") //这里可以加入一个循环判断,直到用户输入y或者n,才退出... choice := "" fmt.scanln(&choice) if choice == "y" || choice == "y" { //调用customerservice的delete方法 if cv.customerservice.delete(id) { fmt.println("------------------删除完成------------------") } else { fmt.println("------------------删除失败,输入的id号不存在") } } } //得到用户的输入id,修改该id对应的客户 func (cv *customerview) update() { cv.list() fmt.println() fmt.println("------------------修改客户------------------") fmt.print("请选择等待修改客户编号(-1退出):") id := -1 fmt.scanln(&id) if id == -1 { return //放弃删除操作 } fmt.print("确认是否修改(y/n):") //这里可以加入一个循环判断,直到用户输入y或者n,才退出... choice := "" fmt.scanln(&choice) if choice == "y" || choice == "y" { //调用customerservice的delete方法 if cv.customerservice.findbyid(id) != -1 { customer := cv.customerservice.getinfobyid(id) fmt.printf("姓名(%v:)", customer.name) name := "" fmt.scanln(&name) fmt.printf("性别(%v):", customer.gender) gender := "" fmt.scanln(&gender) fmt.printf("年龄(%v):", customer.age) age := 0 fmt.scanln(&age) fmt.printf("电话(%v):", customer.phone) phone := "" fmt.scanln(&phone) fmt.printf("邮箱(%v):", customer.email) email := "" fmt.scanln(&email) customer2 := model.newcustomer2(name, gender, age, phone, email) cv.customerservice.update(id, customer2) fmt.println("------------------修改完成------------------") } else { fmt.println("------------------修改失败,输入的id号不存在") } } } //退出 func (cv *customerview) logout() { fmt.print("确认是否退出(y/n):") for { fmt.scanln(&cv.key) if cv.key == "y" || cv.key =="y" || cv.key =="n" || cv.key =="n" { break } fmt.print("你的输入有误,确认是否退出(y/n): ") } if cv.key == "y" || cv.key == "y" { cv.loop = false } } //显示主菜单 func (cv *customerview) mainmenu() { for { fmt.println("------------------客户信息管理软件------------------") fmt.println(" 1 添加客户") fmt.println(" 2 修改客户") fmt.println(" 3 删除客户") fmt.println(" 4 客户列表") fmt.println(" 5 退 出") //fmt.println("请选择(1 - 5):") 换行 fmt.print("请选择(1 - 5):") fmt.scanln(&cv.key) switch cv.key { case "1": //fmt.println("添 加 客 户") cv.add() case "2": //fmt.println("修 改 客 户") cv.update() case "3": cv.delete() case "4": //fmt.println("客 户 列 表") cv.list() case "5": //cv.loop = false cv.logout() default: fmt.print("你的输入有误,请重新输入...") } if !cv.loop { break } } fmt.println("你已经退出了客户关系系统...") } func main() { //在main函数中,创建一个customerview,并运行显示主菜单 customerview := customerview{ key: "", loop: true, } //完成对customerview结构体的customerservice字段的初始化 customerview.customerservice = service.newcustomerservice() //显示主菜单 customerview.mainmenu() }
验证
------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):4 ------------------客户列表------------------ 编号 姓名 性别 年龄 电话 邮箱 1 紫色飞猪 男 22 00000000000 zisefeizhu@qq.com ------------------客户列表------------------ ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):1 ------------------添加客户------------------ 姓名:jingxing 性别:女 年龄:21 电话:00000000000 电邮:jingxing@qq.com ------------------添加完成------------------ ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):2 ------------------客户列表------------------ 编号 姓名 性别 年龄 电话 邮箱 1 紫色飞猪 男 22 00000000000 zisefeizhu@qq.com 2 jingxing 女 21 00000000000 jingxing@qq.com ------------------客户列表------------------ ------------------修改客户------------------ 请选择等待修改客户编号(-1退出):2 确认是否修改(y/n):n ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):2 ------------------客户列表------------------ 编号 姓名 性别 年龄 电话 邮箱 1 紫色飞猪 男 22 00000000000 zisefeizhu@qq.com 2 jingxing 女 21 00000000000 jingxing@qq.com ------------------客户列表------------------ ------------------修改客户------------------ 请选择等待修改客户编号(-1退出):2 确认是否修改(y/n):y 姓名(jingxing:)jingxing 性别(女):女 年龄(21):22 电话(00000000000):00000000000 邮箱(jingxing@qq.com):jingxing@qq.com ------------------修改完成------------------ ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):4 ------------------客户列表------------------ 编号 姓名 性别 年龄 电话 邮箱 1 紫色飞猪 男 22 00000000000 zisefeizhu@qq.com 2 jingxing 女 22 00000000000 jingxing@qq.com ------------------客户列表------------------ ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):3 ------------------删除客户------------------ 请选择等待删除客户编号(-1退出):-1 ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):3 ------------------删除客户------------------ 请选择等待删除客户编号(-1退出):2 确认是否删除(y/n):n ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):3 ------------------删除客户------------------ 请选择等待删除客户编号(-1退出):2 确认是否删除(y/n):y ------------------删除完成------------------ ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):4 ------------------客户列表------------------ 编号 姓名 性别 年龄 电话 邮箱 1 紫色飞猪 男 22 00000000000 zisefeizhu@qq.com ------------------客户列表------------------ ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):5 确认是否退出(y/n):n ------------------客户信息管理软件------------------ 1 添加客户 2 修改客户 3 删除客户 4 客户列表 5 退 出 请选择(1 - 5):5 确认是否退出(y/n):y 你已经退出了客户关系系统...
总结
此项目带给我的最重要意义是:什么时候需要* 什么时候不需要*
当需要修改结构体的变量内容的时候,方法传入的结构体变量参数需要使用指针,也就是结构体的地址。需要修改map中的架构体的变量的时候也需要使用结构体地址作为map的value。如果仅仅是读取结构体变量,可以不使用指针,直接传递引用即可。*type 这里的type这个变量存放的东西是地址,这点需要明确,需要使用&type获取到地址。