go学习之简单项目

news2024/12/25 0:34:46

项目

文章目录

    • 项目
      • 1.项目开发流程图
      • 2.家庭收支记账软件项目
        • 2)项目代码实现
        • 3)具体功能实现
      • 3.客户信息管理系统
        • 1)项目需求说明
        • 2)界面设计
        • 3)项目框架图
        • 4)流程
        • 5)完成显示客户列表的功能
        • 6)添加客户功能
        • 7)删除客户功能
        • 8)修改客户的功能
        • 9)完整代码的展示如下

1.项目开发流程图

在这里插入图片描述

2.家庭收支记账软件项目

1)需求说明

  • 模拟实现基于文本界面的《家庭记账软件》

  • 该软件能够记录家庭的收入、支出,并能够打印收支明细表

  • 项目采用分级菜单的方式,主菜单如下:

    --------家庭收支记账软件-------
             1.收支明细
             2.登记收入
             3.登记支出
             4.退出
             
             请选择(1-4):
             
    
2)项目代码实现

实现基本功能(先使用面向过程,后面改成面向对象)

编写文件TestMyAccount.go 完成基本功能

  1. 功能1:先完成可以显示主菜单,并且可以退出
  2. 功能2:完成可以显示明细和登记收入的功能
  3. 功能3:完成了登记支出的功能
3)具体功能实现

功能1:先完成可以显示主菜单,并且可以退出

思路分析:给出的界面完成,主菜单的显示,当用户输入4的时候就退出

package main
import (
	"fmt"
)

func main(){

	//声明一个变量,保存接收用户输入的选项
	key := ""
	//声明一个变量,控制是否退出for循环
	loop := true

	//显示这个主菜单
	for {
		fmt.Println("--------家庭收支记账软件---------")
		fmt.Println("         1.收支明细")
		fmt.Println("         2.登记收入")
		fmt.Println("         3.登记支出")
		fmt.Println("         4.退出软件")
		fmt.Print("请选择(1-4)")

		fmt.Scanln(&key)

		switch key {
		case "1" :
			fmt.Println("1.收支明细")
		case "2" :
			fmt.Println("2.登记收入")
	    case "3" :
			fmt.Println("3.登记支出")
		case "4" :
			loop = false	
		default :
		    fmt.Println("请输入正确的选项")			
		}

		if !loop {
			break
		}
	}
	fmt.Println("你退出了家庭记账软件的使用")
}

功能2:完成可以显示明细和登记收入的功能

思路分析:

1.因为需要显示明细,我们定义一个变量details string来记录

2.还需要定义变量来记录余额(balance),每次支出的收支的金额(money),以及收支说明(note)

走代码

    //声明一个变量统计余额
	balance := 10000.0
	//每次收支的金额
	money := 0.0
	//每次收支的说明
    note := ""
	//收支的详情
	//当有收支发生的时候,就对details进行拼接处理
	details := "收支\t账户余额\t收支金额\t说明"case的操作
case "2" :
			fmt.Println("本次收入金额:")
			fmt.Scanln(&money)
			balance += money //修改账户余额
			fmt.Println("本次收入的说明:")
			fmt.Scanln(&note)
			//将这个收入情况,拼接到details变量当中
			details += fmt.Sprintf("\n收入\t%v\t%v\t%v",balance,money,note)

功能3完成登记支出的功能

思路分析:登记支出的功能和登记收入的功能类似做一些修改即可

case "3" :
			fmt.Println("本次支出的金额:")
			fmt.Scanln(&money)
			//这里需要做出一个必要的判断
			if money > balance {
				fmt.Println("余额不足")
				break
			}
			balance -=money
			fmt.Println("本次的支出说明:")
			fmt.Scanln(&note)
			details += fmt.Sprintf("\n支出\t%v\t%v\t%v",balance,money,note)

项目改进

1.用户输入4时,给出提示"你确定要退出吗?y/n",必须输入正确的y/n,否则循环输入指令,直到输入y或者n

case "4" :
			fmt.Println("您确定要退出吗? y/n")
			choice :=" "
			for {
				fmt.Scanln(&choice)
				if choice == "y" || choice == "n"{ //输了y/n就break出去
					break
				}
				fmt.Println("您的输入有误请重新输入 y/n")
			}
			if choice == "y" {
				loop = false	
			}
			
			

2.当没有任何收支明细时,提示“当前没有收支明细。。。来一笔把!”

case "1" :
			fmt.Println("------------当前收支明细记录--------")
			if flag {
				fmt.Println(details)
			}else{
				fmt.Println("您当前没有支出记录,来一笔吧!")
			}

3.在支出时,判断余额是否够,并给出相应的提示

case "3" :
			fmt.Println("本次支出的金额:")
			fmt.Scanln(&money)
			//这里需要做出一个必要的判断
			if money > balance {
				fmt.Println("余额不足")
				break
			}
			balance -=money
			fmt.Println("本次的支出说明:")
			fmt.Scanln(&note)
			details += fmt.Sprintf("\n支出\t%v\t%v\t%v",balance,money,note)
			flag = true

面向过程的家庭记账收支软件全部代码

package main
import (
	"fmt"
)

func main(){

	//声明一个变量,保存接收用户输入的选项
	key := ""
	//声明一个变量,控制是否退出for循环
	loop := true
	//声明一个变量统计余额
	balance := 10000.0
	//每次收支的金额
	money := 0.0
	//每次收支的说明
    note := ""
	//定义一个变量记录是否有收支的行为
	flag := false
	//收支的详情
	//当有收支发生的时候,就对details进行拼接处理
	details := "收支\t账户余额\t收支金额\t说明"
	


	//显示这个主菜单
	for {
		fmt.Println("\n--------家庭收支记账软件---------")
		fmt.Println("         1.收支明细")
		fmt.Println("         2.登记收入")
		fmt.Println("         3.登记支出")
		fmt.Println("         4.退出软件")
		fmt.Print("请选择(1-4)")

		fmt.Scanln(&key)

		switch key {
		case "1" :
			fmt.Println("------------当前收支明细记录--------")
			if flag {
				fmt.Println(details)
			}else{
				fmt.Println("您当前没有支出记录,来一笔吧!")
			}
		case "2" :
			fmt.Println("本次收入金额:")
			fmt.Scanln(&money)
			balance += money //修改账户余额
			fmt.Println("本次收入的说明:")
			fmt.Scanln(&note)
			//将这个收入情况,拼接到details变量当中
			details += fmt.Sprintf("\n收入\t%v\t%v\t%v",balance,money,note)
	        flag = true
		case "3" :
			fmt.Println("本次支出的金额:")
			fmt.Scanln(&money)
			//这里需要做出一个必要的判断
			if money > balance {
				fmt.Println("余额不足")
				break
			}
			balance -=money
			fmt.Println("本次的支出说明:")
			fmt.Scanln(&note)
			details += fmt.Sprintf("\n支出\t%v\t%v\t%v",balance,money,note)
			flag = true
		case "4" :
			fmt.Println("您确定要退出吗? y/n")
			choice :=" "
			for {
				fmt.Scanln(&choice)
				if choice == "y" || choice == "n"{ //输了y/n就break出去
					break
				}
				fmt.Println("您的输入有误请重新输入 y/n")
			}
			if choice == "y" {
				loop = false	
			}
			
		default :
		    fmt.Println("请输入正确的选项")	

		}

		if !loop {
			break
		}
	}
	fmt.Println("你退出了家庭记账软件的使用")
}

4.将面向过程的代码改为面向对象的方法编写myFamilyAccount.go,并使用testMyFamilyAccount.go去完成测试。

思路分析

把记账软件的功能封装到一个结构体中,然后调用该结构体的方法来实现记账,显示明细就可以了,结构体的名字为FamilyAccount

再通过main方法中创建一个结构体FamilyAccount实例,实现记账即可

代码实现,代码不需要重新写,只需要引用上侧代码

package objectTestAcc
import (
	"fmt"
)

type FamilyAccount struct {
	//声明必须字段
	
	//声明一个字段,保存接收用户输入的选项
	key string
	//声明一个字段,控制是否退出for循环
	loop bool
	//声明一个字段统计余额
	balance float64
	//每次收支的金额
	money float64
	//每次收支的说明
    note string
	//定义一个字段记录是否有收支的行为
	flag bool
	//收支的详情
	//当有收支发生的时候,就对details进行拼接处理
	details string
}
//编写一个构造方法返回一个FamilyAccount实例 
func NewFamilyAccount() *FamilyAccount {
	return &FamilyAccount{
		key : "",
		loop : true,
		balance : 10000.0,
		money : 0.0,
		note : "",
		flag : false,
		details :  "收支\t账户余额\t收支金额\t说明",
	}
}

//将显示明细写成一个方法
func (this *FamilyAccount) ShowDetails(){
    fmt.Println("------------当前收支明细记录--------")
	if this.flag {
		fmt.Println(this.details)
	}else{
		fmt.Println("您当前没有支出记录,来一笔吧!")
	}
}

//将登记收入写成一个方法和*FamilyAccount绑定
func (this *FamilyAccount) Income(){
	fmt.Println("本次收入金额:")
	fmt.Scanln(&this.money)
	this.balance += this.money //修改账户余额
	fmt.Println("本次收入的说明:")
	fmt.Scanln(&this.note)
	//将这个收入情况,拼接到details变量当中
	this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v",this.balance,this.money,this.note)
	this.flag = true
}
//将支出也绑定到一个方法当中
func (this *FamilyAccount) Pay(){
	fmt.Println("本次支出的金额:")
	fmt.Scanln(&this.money)
	//这里需要做出一个必要的判断
	if this.money > this.balance {
		fmt.Println("余额不足")
	}
	this.balance -=this.money
	fmt.Println("本次的支出说明:")
	fmt.Scanln(&this.note)
	this.details += fmt.Sprintf("\n支出\t%v\t%v\t%v",this.balance,this.money,this.note)
	this.flag = true
}

//将退出系统写成一个方法
func (this *FamilyAccount) exit(){
	fmt.Println("您确定要退出吗? y/n")
	choice :=" "
	for {
		fmt.Scanln(&choice)
		if choice == "y" || choice == "n"{ //输了y/n就break出去
			break
		}
		fmt.Println("您的输入有误请重新输入 y/n")
	}
	if choice == "y" {
		this.loop = false	
	}
}

//为该结构体绑定相应的方法
//显示主菜单
func (this *FamilyAccount) MainMenu(){
	for {
		fmt.Println("\n--------家庭收支记账软件---------")
		fmt.Println("         1.收支明细")
		fmt.Println("         2.登记收入")
		fmt.Println("         3.登记支出")
		fmt.Println("         4.退出软件")
		fmt.Print("请选择(1-4)")
		fmt.Scanln(&this.key)
		switch this.key {
		case "1" :
			this.ShowDetails()
		case "2" :
			this.Income()
		case "3" :
			this.Pay()
		case "4" :
			this.exit()	
		default :
		    fmt.Println("请输入正确的选项")	
		}

		if !this.loop {
			break
		}
	}
}
建立一个main方法
package main
import (
	"fmt"
	"go_code/project/objectTestAcc"
)

func main() {
	fmt.Println("这个是面向对象的方式完成")
	objectTestAcc.NewFamilyAccount().MainMenu()

}



3.客户信息管理系统

1)项目需求说明

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

该软件能够实现对客户对象的插入、修改和删除(用切片实现),并能够打印客户明细表 多个对象协同工作

2)界面设计

在这里插入图片描述

添加客户界面

在这里插入图片描述

修改客户界面

在这里插入图片描述

删除客户界面

在这里插入图片描述

客户列表的界面

在这里插入图片描述

3)项目框架图

在这里插入图片描述

4)流程

功能说明

当用户运行程序,可以看到主菜单,当输入5时,可以退出该软件

思路分析

编写customerView.go另外可以把customer.go和customerDervice.go协商

代码实现

customerManager/model/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,
		}
	}


customerManagerservice/customerService.go

package service
import (
	"go_code/project/customerManager/model"
)

//该CustomerService ,完成对Customer的操作,包括增删改查
type CustomerService struct {
	customers []model.Customer
    //声明一个字段,表示当前切片含有多少客户
	//该字段后面,还可以作为新客户的id+1
	customerNum int
}

customerManager/view/customerView.go

package main
import (
	"fmt"
)

type customerView struct {
     //定义必要字段
	 key string //接收用户输入
	 loop bool //是否循环显示菜单

}

//显示主菜单
func (this *customerView) mainView() {
	for{
		fmt.Println("--------客户信息管理系统------------")
		fmt.Println("         1.添加客户   ")
		fmt.Println("         2.修改客户   ")
		fmt.Println("         3.删除客户   ")
		fmt.Println("         4.客户列表   ")
		fmt.Println("         5.退出   ")
		fmt.Println("请选择(1-5): ")

		fmt.Scanln(&this.key)
		switch this.key {
		case "1":
			fmt.Println("添加客户")
		case "2":
		    fmt.Println("修改客户")
		case "3":
			fmt.Println("删除客户")
		case "4":
			fmt.Println("客户列表")
		case "5":
			this.loop = false
		default :
		    fmt.Println("你的输入有误,请重新输入...")						
		}
		if !this.loop {
			break
		}
	}
	fmt.Println("你退出了客户关系管理系统的使用")
}
func main() {
	//在主函数中,创建一个customerView并运行显示主菜单...
	customerView := customerView{
		key : "",
		loop : true,	
	}
	//显示主菜单
	customerView.mainView()
}

5)完成显示客户列表的功能

思路分析

在这里插入图片描述

代码实现

customerManager/model/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,
	}
}
//增加了这个方法
//返回用户的信息,格式化的字符串
func (this Customer) GetInfo() string{
	info := fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v\t",this.Id,this.Name,
	this.Gender,this.Age,this.Phone,this.Email)
	return info
} 


customerManagerservice/customerService.go

package service
import (
	"go_code/project/customerManager/model"
)

//该CustomerService ,完成对Customer的操作,包括增删改查
type CustomerService struct {
	customers []model.Customer
    //声明一个字段,表示当前切片含有多少客户
	//该字段后面,还可以作为新客户的id+1
	customerNum int
}

//编写一个方法,可以返回一个*customerService实例
func NewCustomerService() *CustomerService {
	//为了可以看到客户在切片中,我们初始化一个客户
	customerService := &CustomerService{}
	customerService.customerNum = 1
	customer := model.NewCustomer(1,"张三","男",20,"112","zs@sohu.com")
	customerService.customers = append(customerService.customers ,customer)
	return customerService
}

//返回客户切片
func (this *CustomerService) List()[]model.Customer{
    return this.customers
}


customerManager/view/customerView.go

package main
import (
	"fmt"
	"go_code/project/customerManager/service"
)

type customerView struct {
     //定义必要字段
	 key string //接收用户输入
	 loop bool //是否循环显示菜单
	 //增加一个字段customerService
     customerService   *service.CustomerService
}

//显示所有的客户信息
func (this *customerView) list(){
     //首先获取到当前所有的客户信息(在切片中)
	 customers := this.customerService.List()
	 //显示
	 fmt.Println("----------客户列表--------------")
	 fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
	 for i :=0;i<len(customers);i++ {
		fmt.Println(customers[i].GetInfo())
	 }
	 fmt.Printf("\n--------客户列表完成------------\n\n")
}

//显示主菜单
func (this *customerView) mainView() {
	for{
		fmt.Println("--------客户信息管理系统------------")
		fmt.Println("         1.添加客户   ")
		fmt.Println("         2.修改客户   ")
		fmt.Println("         3.删除客户   ")
		fmt.Println("         4.客户列表   ")
		fmt.Println("         5.退出   ")
		fmt.Println("请选择(1-5): ")


		fmt.Scanln(&this.key)
		switch this.key {
		case "1":
			fmt.Println("添加客户")
		case "2":
		    fmt.Println("修改客户")
		case "3":
			fmt.Println("删除客户")
		case "4":
			this.list()
		case "5":
			this.loop = false
		default :
		    fmt.Println("你的输入有误,请重新输入...")						
		}
		if !this.loop {
			break
		}
	}
	fmt.Println("你退出了客户关系管理系统的使用")
}
func main() {
	//在主函数中,创建一个customerView并运行显示主菜单...
	customerView := customerView{
		key : "",
		loop : true,	
	}
	//完成对customerView结构体的customerService字段的初始化
	customerView.customerService = service.NewCustomerService()
	//显示主菜单
	customerView.mainView()
}

6)添加客户功能

功能说明

在这里插入图片描述

思路分析

在这里插入图片描述

代码实现

需要编写CustomerView和customerService,Customer类

规定,新添加的学院的id就是他是第几个加入的

customerManager/model/customer.go

//编写一个工厂模式,返回二种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,
	}
}

customerManagerservice/customerService.go

增加一个方法
//添加客户到customer切片中
func (this *CustomerService) Add(customer model.Customer) bool{

	//我们确定一个分配id的规则,就是添加的顺序
	this.customerNum ++
	customer.Id = this.customerNum
	this.customers = append(this.customers,customer)
    return true
}


customerManager/view/customerView.go

编写一个add方法调用servic蹭的Add()
//得到用户的输入,信息构建新的客户,并完成添加
func (this *customerView) add() {
	fmt.Println("------------添加客户------------")
	fmt.Println("姓名:")
	name := ""
	fmt.Scanln(&name)
	fmt.Println("性别:")
	gender := ""
	fmt.Scanln(&gender)
	fmt.Println("年龄:")
	age := 0
	fmt.Scanln(&age)
	fmt.Println("电话号码:")
	phone := ""
	fmt.Scanln(&phone)
	fmt.Println("电邮:")
	email := ""
	fmt.Scanln(&email)

	//构建一个新的Customer实例
	//注意:id号没有让用户输入,id号是唯一的,让系统分配即可
	customer := model.NewCustomer2(name,gender,age,phone,email)
	//调用
	if this.customerService.Add(customer) {
		fmt.Println("------------添加完成------------")
	}else{
		fmt.Println("------------添加失败------------")
	}
}
下面的switch方法也要改一下
case "1":
			this.add()
7)删除客户功能

功能说明

在这里插入图片描述

思路分析

需要编写CustomerView和CustomerService

在这里插入图片描述

代码实现

customerManager/model/customer.go:无变化

customerManagerservice/customerService.go

增加了这两个方法,一个删除一个查找id
//根据id删除客户(从切片中删除)
func (this *CustomerService) Delete(id int )bool {
	index :=this.FindById(id)
	//如果index ==-1说明没有这个客户
	if index== -1 {
		return false
	}
		//如何从切片中删除一个元素
	this.customers = append(this.customers[:index],this.customers[index+1:]...)
	return true
	
}

//根据Id查找客户在在切片对应中的下标,返回-1
func (this *CustomerService) FindById(id int) int {
	//默认为-1
	index := -1
	//遍历this.customers切片
	for i :=0;i < len(this.customers);i++ {
		if this.customers[i].Id ==id {
			//找到了
			index = i
		}
	}
	return index
}

customerManager/view/customerView.go

增加这个方法
//得到用户输入的id删除该id对应的客户
func (this *customerView) delete() {
	fmt.Println("------------删除客户------------")
	fmt.Println("请选择待删除的客户编号(-1退出):")
	id :=-1
	fmt.Scanln(&id)
	if id == -1 {
		return //放弃删除操作
	}

	fmt.Println("确认是否删除(Y/N): ")
	choice := ""
	fmt.Scanln(&choice)
	if choice == "y" || choice == "Y" {
			//调用service中的delete方法
		if this.customerService.Delete(id) {
			fmt.Println("------------删除成功------------")
	}else{
		fmt.Println("------------删除失败,输入的id号不存在------------")
	}
  }
}

8)完善退出确认功能

功能说明:

要求用户在退出时提示“是否退出(Y/N),用户必须输入y/n否则循环提示

思路分析:需编写CustomerView

代码实现

在customerManager/view/customerView.go增加这个方法

//退出软件
func (this *customerView) exit(){
	fmt.Println("确定是否退出(Y/N): ")
	for {
	fmt.Scanln(&this.key)
	if this.key == "Y" || this.key == "y" || this.key == "N" || this.key == "n"{
		break
	  }
	  fmt.Println("您的输入有误,请重新输入(Y/N) : ")
	}
	if this.key == "Y" || this.key == "y" {
		this.loop = false
	}
}
然后在switch中修改一下
case "5":
			this.exit()
8)修改客户的功能

功能说明:根据id进行对客户的修改操作

思路:依旧在customerService和customerView中进行编写操作

代码实现

customerManagerservice/customerService.go

//根据id进行修改客户信息的操作
func (this *CustomerService) Update(customer model.Customer) bool {
	index :=this.FindById(customer.Id)
	//如果index ==-1说明没有这个客户
	if index== -1 {
		return false
	}
	//将customer插入到指定的位置并对customers进行更新操作,就将原来位置的customer用一个新的customer进行替换操作
	this.customers = append(append(this.customers[:index],customer),this.customers[index+1:]...)
    return true
}

//根据Id查找客户在在切片对应中的下标,返回-1
func (this *CustomerService) FindById(id int) int {
	//默认为-1
	index := -1
	//遍历this.customers切片
	for i :=0;i < len(this.customers);i++ {
		if this.customers[i].Id ==id {
			//找到了
			index = i
		}
	}
	return index
}

customerManager/view/customerView.go

//修改客户的操作
func (this *customerView) update() {
	fmt.Println("------------修改客户------------")
    fmt.Println("请选择修改客户的编号(-1的话就退出): ")
	id := -1
	fmt.Scanln(&id)
	if id == -1 {
		return
	}

	fmt.Println("姓名:")
	name := ""
	fmt.Scanln(&name)
	fmt.Println("性别:")
	gender := ""
	fmt.Scanln(&gender)
	fmt.Println("年龄:")
	age := 0
	fmt.Scanln(&age)
	fmt.Println("电话号码:")
	phone := ""
	fmt.Scanln(&phone)
	fmt.Println("电邮:")
	email := ""
	fmt.Scanln(&email)

	//构建一个新的Customer实例
	//注意:id号没有让用户输入,id号是唯一的,让系统分配即可
	customer := model.NewCustomer(id,name,gender,age,phone,email)
	//调用
	if this.customerService.Update(customer) {
		fmt.Println("------------修改成功------------")
	}else{
		fmt.Println("------------修改失败------------")
	}
}

再外加一个简单的登录操作使得项目更加完善

在customerManager/view/customerView.go中进行编写

//简单登录功能的时间
func (this *customerView) Login (){
	account :=""
	pwd :=""
	for {
    fmt.Println("请输入账号: ")
	fmt.Scanln(&account)
	fmt.Println("请输入密码")
	fmt.Scanln(&pwd)
	if account == "7758258" && pwd =="111"{
		fmt.Println("恭喜你!正在进入系统!")
		break
	   }
	   fmt.Println("您的输入的账号或者密码有误,请重新输入: ")	   	
	}
	this.mainView()
}
func main() {
	//在主函数中,创建一个customerView并运行显示主菜单...
	customerView := customerView{
		key : "",
		loop : true,	
	}
	//完成对customerView结构体的customerService字段的初始化
	customerView.customerService = service.NewCustomerService()
	//显示主菜单
	customerView.Login()
}
9)完整代码的展示如下

customerManager/model/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 (this Customer) GetInfo() string{
	info := fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v\t",this.Id,this.Name,
	this.Gender,this.Age,this.Phone,this.Email)
	return info
} 


customerManagerservice/customerService.go

package service
import (
	"go_code/project/customerManager/model"
)

//该CustomerService ,完成对Customer的操作,包括增删改查
type CustomerService struct {
	customers []model.Customer
    //声明一个字段,表示当前切片含有多少客户
	//该字段后面,还可以作为新客户的id+1
	customerNum int
}

//编写一个方法,可以返回一个*customerService实例
func NewCustomerService() *CustomerService {
	//为了可以看到客户在切片中,我们初始化一个客户
	customerService := &CustomerService{}
	customerService.customerNum = 1
	customer := model.NewCustomer(1,"张三","男",20,"112","zs@sohu.com")
	customerService.customers = append(customerService.customers ,customer)
	return customerService
}

//返回客户切片
//一定要使用指针的方式
func (this *CustomerService) List()[]model.Customer{
    return this.customers
}

//添加客户到customer切片中
//必须要用指针的方式,保证一直用的都是一个CustomerService
func (this *CustomerService) Add(customer model.Customer) bool{

	//我们确定一个分配id的规则,就是添加的顺序
	this.customerNum ++
	customer.Id = this.customerNum
	this.customers = append(this.customers,customer)
    return true
}

//根据id删除客户(从切片中删除)
func (this *CustomerService) Delete(id int )bool {
	index :=this.FindById(id)
	//如果index ==-1说明没有这个客户
	if index== -1 {
		return false
	}
		//如何从切片中删除一个元素
	this.customers = append(this.customers[:index],this.customers[index+1:]...)
	return true
	
}

//根据id进行修改客户信息的操作
func (this *CustomerService) Update(customer model.Customer) bool {
	index :=this.FindById(customer.Id)
	//如果index ==-1说明没有这个客户
	if index== -1 {
		return false
	}
	//将customer插入到指定的位置并对customers进行更新操作,就将原来位置的customer用一个新的customer进行替换操作
	this.customers = append(append(this.customers[:index],customer),this.customers[index+1:]...)
    return true
}

//根据Id查找客户在在切片对应中的下标,返回-1
func (this *CustomerService) FindById(id int) int {
	//默认为-1
	index := -1
	//遍历this.customers切片
	for i :=0;i < len(this.customers);i++ {
		if this.customers[i].Id ==id {
			//找到了
			index = i
		}
	}
	return index
}



customerManager/view/customerView.go

package main
import (
	"fmt"
	"go_code/project/customerManager/service"
	"go_code/project/customerManager/model"
)

type customerView struct {
     //定义必要字段
	 key string //接收用户输入
	 loop bool //是否循环显示菜单
	 //增加一个字段customerService
     customerService   *service.CustomerService
}

//显示所有的客户信息
func (this *customerView) list(){
     //首先获取到当前所有的客户信息(在切片中)
	 customers := this.customerService.List()
	 //显示
	 fmt.Println("----------客户列表--------------")
	 fmt.Println("编号\t姓名\t性别\t年龄\t电话\t邮箱")
	 for i :=0;i<len(customers);i++ {
		fmt.Println(customers[i].GetInfo())
	 }
	 fmt.Printf("\n--------客户列表完成------------\n\n")
}

//得到用户的输入,信息构建新的客户,并完成添加
func (this *customerView) add() {
	fmt.Println("------------添加客户------------")
	fmt.Println("姓名:")
	name := ""
	fmt.Scanln(&name)
	fmt.Println("性别:")
	gender := ""
	fmt.Scanln(&gender)
	fmt.Println("年龄:")
	age := 0
	fmt.Scanln(&age)
	fmt.Println("电话号码:")
	phone := ""
	fmt.Scanln(&phone)
	fmt.Println("电邮:")
	email := ""
	fmt.Scanln(&email)

	//构建一个新的Customer实例
	//注意:id号没有让用户输入,id号是唯一的,让系统分配即可
	customer := model.NewCustomer2(name,gender,age,phone,email)
	//调用
	if this.customerService.Add(customer) {
		fmt.Println("------------添加完成------------")
	}else{
		fmt.Println("------------添加失败------------")
	}
}

//修改客户的操作
func (this *customerView) update() {
	fmt.Println("------------修改客户------------")
    fmt.Println("请选择修改客户的编号(-1的话就退出): ")
	id := -1
	fmt.Scanln(&id)
	if id == -1 {
		return
	}

	fmt.Println("姓名:")
	name := ""
	fmt.Scanln(&name)
	fmt.Println("性别:")
	gender := ""
	fmt.Scanln(&gender)
	fmt.Println("年龄:")
	age := 0
	fmt.Scanln(&age)
	fmt.Println("电话号码:")
	phone := ""
	fmt.Scanln(&phone)
	fmt.Println("电邮:")
	email := ""
	fmt.Scanln(&email)

	//构建一个新的Customer实例
	//注意:id号没有让用户输入,id号是唯一的,让系统分配即可
	customer := model.NewCustomer(id,name,gender,age,phone,email)
	//调用
	if this.customerService.Update(customer) {
		fmt.Println("------------修改成功------------")
	}else{
		fmt.Println("------------修改失败------------")
	}
}

//得到用户输入的id删除该id对应的客户
func (this *customerView) delete() {
	fmt.Println("------------删除客户------------")
	fmt.Println("请选择待删除的客户编号(-1退出):")
	id :=-1
	fmt.Scanln(&id)
	if id == -1 {
		return //放弃删除操作
	}

	fmt.Println("确认是否删除(Y/N): ")
	choice := ""
	for {
	fmt.Scanln(&choice)
		if choice == "y" || choice == "Y" || choice =="n" || choice =="N"{
			break
		}
		fmt.Println("您的输入有误请重新输入(Y/N): ")
	}
	if choice == "y" || choice == "Y" {
			//调用service中的delete方法
		if this.customerService.Delete(id) {
			fmt.Println("------------删除成功------------")
	}else{
		fmt.Println("------------删除失败,输入的id号不存在------------")
	}
  } else{
	this.mainView()
  }
}

//退出软件
func (this *customerView) exit(){
	fmt.Println("确定是否退出(Y/N): ")
	for {
	fmt.Scanln(&this.key)
	if this.key == "Y" || this.key == "y" || this.key == "N" || this.key == "n"{
		break
	  }
	  fmt.Println("您的输入有误,请重新输入(Y/N) : ")
	}
	if this.key == "Y" || this.key == "y" {
		this.loop = false
	}
}

//显示主菜单
func (this *customerView) mainView() {
	for{
		fmt.Println("--------客户信息管理系统------------")
		fmt.Println("         1.添加客户   ")
		fmt.Println("         2.修改客户   ")
		fmt.Println("         3.删除客户   ")
		fmt.Println("         4.客户列表   ")
		fmt.Println("         5.退出   ")
		fmt.Println("请选择(1-5): ")


		fmt.Scanln(&this.key)
		switch this.key {
		case "1":
			this.add()
		case "2":
		    this.update()
		case "3":
			this.delete()
		case "4":
			this.list()
		case "5":
			this.exit()
		default :
		    fmt.Println("你的输入有误,请重新输入...")						
		}
		if !this.loop {
			break
		}
	}
	fmt.Println("你退出了客户关系管理系统的使用")
}

//简单登录功能的时间
func (this *customerView) Login (){
	account :=""
	pwd :=""
	for {
    fmt.Println("请输入账号: ")
	fmt.Scanln(&account)
	fmt.Println("请输入密码")
	fmt.Scanln(&pwd)
	if account == "7758258" && pwd =="111"{
		fmt.Println("恭喜你!正在进入系统!")
		break
	   }
	   fmt.Println("您的输入的账号或者密码有误,请重新输入: ")	   	
	}
	this.mainView()
}
func main() {
	//在主函数中,创建一个customerView并运行显示主菜单...
	customerView := customerView{
		key : "",
		loop : true,	
	}
	//完成对customerView结构体的customerService字段的初始化
	customerView.customerService = service.NewCustomerService()
	//显示主菜单
	customerView.Login()
}

10)项目展示

1.登录

在这里插入图片描述

2.客户列表

在这里插入图片描述

3.添加客户

在这里插入图片描述

4.修改客户

在这里插入图片描述

5.删除客户

在这里插入图片描述

6.退出

在这里插入图片描述

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

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

相关文章

leetcode刷题日记:190. Reverse Bits(颠倒二进制位)和191. Number of 1 Bits( 位1的个数)

190. Reverse Bits&#xff08;颠倒二进制位&#xff09; 题目要求我们将一个数的二进制位进行颠倒&#xff0c;画出图示如下(以8位二进制为例)&#xff1a; 显然对于这种问题我们需要用到位操作&#xff0c;我们需要将原数的每一位取出来然后颠倒之后放进另一个数。 我们需要…

被锁总时间

题目描述&#xff1a; 对一个事务进行加锁与解锁&#xff0c;其中有加锁数组&#xff0c;解锁数组&#xff0c;这两个数组长度相等&#xff0c;且数组内数据代表加锁与解锁的具体时间点&#xff0c;求给出数组中事务的总被锁时间。&#xff08;其中加锁后默认在60秒后解锁&…

【信息安全】浅谈三种XSS(跨站脚本攻击)的攻击流程与防御措施

银狼美图镇楼 XSS 跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;是一种常见的Web安全漏洞&#xff0c;攻击者通过在Web应用中注入恶意脚本&#xff0c;使得浏览器在解析页面时执行该脚本&#xff0c;从而实现攻击目的。 类型 存储型XSS&…

SPASS-回归分析

回归分析概述 确定性关系与非确定性关系 变量与变量之间的关系分为确定性关系和非确定性关系,函数表达确定性关系。研究变量间的非确定性关系,构造变量间经验公式的数理统计方法称为回归分析。 回归分析基本概念 回归分析是指通过提供变量之间的数学表达式来定量描述变量间…

Oracle主备切换,ogg恢复方法(集成模式)

前言: 文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover)&#xff0c;在主库运行的ogg进程(集成模式)如何进行恢复。 测试恢复场景&#xff0c;因为集成模式不能在备库配置&#xff0c;所以场景都是基于主库端: 1 主备发生switchover切换&#xff0c;主库…

LeetCode - 622. 设计循环队列(C语言,顺序存储结构,配图)

622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 设计循环队列&#xff0c;我们可以从顺序结构和链式结构来考虑&#xff0c;但因为链式结构实现起来较为复杂&#xff0c;不易理解&#xff0c;且主流使用顺序存储&#xff0c;所以本文就是用顺序存储结构实现。 因为…

【Spring】之注解存取Bean对象

在本系列的上一篇文章中&#xff0c;我们已经了解了Spring的一些核心概念&#xff0c;并且还学习了Spring存取。但是我们发现在存取的过程中还是比较复杂&#xff0c;接下来我们将学习更为简单的Spring存取&#xff0c;其中涉及到的主要内容就是注解。并且在Spring家族的学习过…

Virtual安装centos后,xshell连接centos

1. 网络使用Host-Only模式动态分配IP&#xff0c;运行 system restart network 后&#xff0c;使用ifconfig查看新的ip&#xff0c;XShell可以直接连上centos&#xff0c; 但是由于使用的是Host-Only模式&#xff0c;centos不能访问网络&#xff0c;只能与宿主机相互通信 2. 网…

【C语言基础】分享近期学习到的volatile关键字、__NOP__()函数以及# #if 1 #endif

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【算法每日一练]-分块(保姆级教程 篇1)POJ3648

插讲一下分块 题目&#xff1a;&#xff08;POJ 3648&#xff09; 一个简单的整数问题 前缀和往往用于静态的不会修改的区间和。遇到经常修改的区间问题&#xff0c;就要用分块或线段树来维护了。 分块算法是优化后的暴力&#xff0c;分块算法有时可以维护一些线段树维护不了的…

【JavaEE初阶】计算机是如何工作的

一、计算机发展史 计算的需求在⼈类的历史中是广泛存在的&#xff0c;发展大体经历了从⼀般计算⼯具到机械计算机到目前的电子计算机的发展历程。 人类对计算的需求&#xff0c;驱动我们不断的发明、改善计算机。目前这个时代是“电子计算机”的时代&#xff0c;发展的潮流是…

【算法挨揍日记】day21——64. 最小路径和、174. 地下城游戏

64. 最小路径和 64. 最小路径和 题目描述&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 解题思路&#xff1a; 状态表示&…

数据结构与算法之美学习笔记:21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?

目录 前言什么是哈希算法&#xff1f;应用一&#xff1a;安全加密应用二&#xff1a;唯一标识应用三&#xff1a;数据校验散列函数解答开篇内容小节 前言 本节课程思维导图 如果你是 一名工程师&#xff0c;你会如何存储用户密码这么重要的数据吗&#xff1f;仅仅 MD5 加密一下…

Java拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…

YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FoucsIoU等损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其Focus变种 一、本文介绍 本文给…

拼图小游戏

运行出的游戏界面如下&#xff1a; User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password;public User() {}public User(String username, String password) {this.user…

【C语言基础】分享近期学习到的volatile关键字、__NOP()以及# #if 1 #endif

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

记录基于scapy构造ClientHello报文的尝试

最近有个需求就是用scapy构造https的client hello报文&#xff0c;由用户指定servername构造对应的报文。网上对于此的资料甚少&#xff0c;有的也是怎么去解析https报文&#xff0c;但是对于如果构造基本上没有找到相关的资料。 一直觉得最好的老师就是Python的help功能和dir功…

分组交换技术

目录 一、新型计算机网络的基本特点 二、电路交换 1、回顾电路交换的原理 2、使用交换机连接许多部电话 3、电路交换举例 4、电路交换的三个阶段 5、电路交换的特点 三、分组交换 1、因特网有边缘部分与核心部分组成 2、分组交换的原理 3、分组交换的优点 4、存储转…

如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?

在数据科学领域&#xff0c;Jupyter Notebook 已成为处理数据的必备工具。 其用途包括数据清理和探索、可视化、机器学习和大数据分析。Jupyter Notebook的安装非常简单&#xff0c;如果你是小白&#xff0c;那么建议你通过安装Anaconda来解决Jupyter Notebook的安装问题&#…