go语言项目 - 客户信息关系系统

2022-10-08,,,,

学习一门语言最好的方式就是通过一个实际的例子。通过这个实例,不仅可以进一步巩固golang的相关基础技能,同时,也能让我们加强自己的逻辑能力,从一步步的调用函数,掌握参数传递和接收技巧。

项目2 - 客户信息关系系统

该项目很好的展示了基于面向对象的增删改查功能的实现。

任何一个项目在敲代码之前都要做好需求分析

项目需求分析

  1. 模拟实现基于文本界面的《客户信息管理软件》

  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获取到地址。

《go语言项目 - 客户信息关系系统.doc》

下载本文的Word格式文档,以方便收藏与打印。