golang-项目实践下

本文介绍了使用Golang构建项目时的常见架构模式,包括model层用于数据表示,service层处理主要逻辑,以及view层负责展示。通过具体的客户添加和删除功能实现,详细阐述了如何在各个层之间进行交互,特别是删除功能的思路,涉及通过用户ID进行匹配和删除的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
项目结构:
在这里插入图片描述

  • model : 用来表示数据
  • service : 用来做主要的逻辑处理
  • view :视图用来进行展示,调用service

customer.go model层

// 定义结构体元素
package model

import (
	"fmt"
)

type Custmer struct{
	Id int
	Name string
	Gender string
	Age int
	Phone string
	Email string
}

// 定义一个工厂模式函数返回 custmer结构体实例变量
func Newcustmer(id int,name string,gender string,age int,phone string,email string)*Custmer{
	return &Custmer{
		Id : id,
		Name : name,
		Gender : gender,
		Age : age,
		Phone : phone,
		Email : email,
	}
}

func (this Custmer)GetInfo()string{
	info := fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v\n",
	this.Id,this.Name,this.Gender,this.Age,this.Phone,this.Email)
	return info
}

constomerservice.go service层

// 完成对 model/customer.go的操作,包括增删改查
package service

import (
	"goOctober/demo-10-15/custmer/model"
)

type Constomerservice struct{
	// 声明一个切片元素用来存放客户
	custmers []model.Custmer
	custmerNum int
}

// 编写一个函数用来调用customermodel传入实参并追加到切片中
func Newconstomerservice()*Constomerservice{
	constomerservice := &Constomerservice{}
	constomer := model.Newcustmer(1,"飞来峰","男",100,"110","1@1.qq.com")
	constomerservice.custmerNum = 1
	constomerservice.custmers = append(constomerservice.custmers,*constomer)
	return constomerservice
}

// 返回客户切片
func (con *Constomerservice)Showmaker()[]model.Custmer{
	return con.custmers
}

constomerview.go view层

package main

import (
	"fmt"
	"goOctober/demo-10-15/custmer/service"
)

type custmerview struct{
	key int
	loop bool
	// service/Constomerservice指针类型结构体
	constomerservice *service.Constomerservice
}

func (cut *custmerview)list(){
	// cut.constomerservice.service.Showmaker()返回客户列表
	ccs := cut.constomerservice.Showmaker()
	fmt.Println("-------客户列表------")
	fmt.Printf("ID\t姓名\t性别\t年龄\tphone\tEmail\t\n")
	// 遍历输出打印客户列表
	// css[k].GetInfo() = css.Constomerservice.[]model.Custmer.GetInfo()
	for k,_ := range ccs{
		fmt.Println(ccs[k].GetInfo())
	}
}

func (cust custmerview) mainmenu(){
	for{
		fmt.Println("-------客户信息管理系统------")
		fmt.Println("		1 添加客户		")
		fmt.Println("		2 修改客户		")
		fmt.Println("		3 删除客户		")
		fmt.Println("		4 客户列表		")
		fmt.Println("		5 退	出		")
		fmt.Println("请选择需要的服务1-5")
		fmt.Scanln(&cust.key)
		switch cust.key{
		case 1:
			fmt.Println("		添加客户		")
		case 2:
			fmt.Println("		修改客户		")
		case 3:
			fmt.Println("		删除客户		")
		case 4:
			fmt.Println("		客户列表		")
			cust.list()
		case 5:
			fmt.Println("		退   出			")
			cust.loop = false
		default :
			fmt.Println("输入有误!")
		}
		if cust.loop != true{
			break
		}
	}
}

func main(){
	var c custmerview
	c.constomerservice = service.Newconstomerservice()
	c.mainmenu()
}

客户添加功能:
在这里插入图片描述

// 定义结构体元素
package model

import (
	"fmt"
)

type Custmer struct{
	Id int
	Name string
	Gender string
	Age int
	Phone string
	Email string
}

// 定义一个工厂模式函数返回 custmer结构体实例变量
func Newcustmer(id int,name string,gender string,age int,phone string,email string)*Custmer{
	return &Custmer{
		Id : id,
		Name : name,
		Gender : gender,
		Age : age,
		Phone : phone,
		Email : email,
	}
}
// 第二个构造方法不带ID
func Newcustmer2(name string,gender string,age int,phone string,email string)*Custmer{
	return &Custmer{
		Name : name,
		Gender : gender,
		Age : age,
		Phone : phone,
		Email : email,
	}
}

func (this Custmer)GetInfo()string{
	info := fmt.Sprintf("%v\t%v\t%v\t%v\t%v\t%v\n",
	this.Id,this.Name,this.Gender,this.Age,this.Phone,this.Email)
	return info
}
// 完成对 model/customer.go的操作,包括增删改查
package service

import (
	"goOctober/demo-10-15/custmer/model"
)

type Constomerservice struct{
	// 声明一个切片元素用来存放客户
	custmers []model.Custmer
	custmerNum int
}

// 编写一个函数用来调用customermodel传入实参并追加到切片中
func Newconstomerservice()*Constomerservice{
	constomerservice := &Constomerservice{}
	constomer := model.Newcustmer(1,"飞来峰","男",100,"110","1@1.qq.com")
	constomerservice.custmerNum = 1
	constomerservice.custmers = append(constomerservice.custmers,*constomer)
	return constomerservice
}

// 返回客户切片
func (con *Constomerservice)Showmaker()[]model.Custmer{
	return con.custmers
}

// 这里不太懂为啥要返回一个true
func (con *Constomerservice)AddUser(custmer model.Custmer)bool{
	con.custmerNum++
	custmer.Id = con.custmerNum
	con.custmers = append(con.custmers,custmer)
	return true
}
package main

import (
	"fmt"
	"goOctober/demo-10-15/custmer/service"
	"goOctober/demo-10-15/custmer/model"
)

type custmerview struct{
	key int
	loop bool
	// service/Constomerservice指针类型结构体
	constomerservice *service.Constomerservice
}

func (cut *custmerview)list(){
	// cut.constomerservice.service.Showmaker()返回客户列表
	ccs := cut.constomerservice.Showmaker()
	fmt.Println("-------客户列表------")
	fmt.Printf("ID\t姓名\t性别\t年龄\tphone\tEmail\t\n")
	// 遍历输出打印客户列表
	// css[k].GetInfo() = css.Constomerservice.[]model.Custmer.GetInfo()
	for k,_ := range ccs{
		fmt.Println(ccs[k].GetInfo())
	}
}

//  添加用户
// id让系统分配,不能由用户输入
func (cu *custmerview)adduser(){
	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:")
	email := ""
	fmt.Scanln(&email)

	custmertwo := model.Newcustmer2(name,gender,age,phone,email)
   	cu.constomerservice.AddUser(*custmertwo)
}

func (cust custmerview) mainmenu(){
	for{
		fmt.Println("-------客户信息管理系统------")
		fmt.Println("		1 添加客户		")
		fmt.Println("		2 修改客户		")
		fmt.Println("		3 删除客户		")
		fmt.Println("		4 客户列表		")
		fmt.Println("		5 退	出		")
		fmt.Println("请选择需要的服务1-5")
		fmt.Scanln(&cust.key)
		switch cust.key{
		case 1:
			fmt.Println("		添加客户		")
			cust.adduser()
		case 2:
			fmt.Println("		修改客户		")
		case 3:
			fmt.Println("		删除客户		")
		case 4:
			fmt.Println("		客户列表		")
			cust.list()
		case 5:
			fmt.Println("		退   出			")
			cust.loop = true
		default :
			fmt.Println("输入有误!")
		}
		if cust.loop != false{
			break
		}
	}
}

func main(){
	var c custmerview
	c.constomerservice = service.Newconstomerservice()
	c.mainmenu()
}

删除功能实现:
思路分析:

  • 通过id匹配删除的用户
    在这里插入图片描述
// model层
package model

import (
	"fmt"
)

type Customer struct{
	Id int
	Name string
	Age int
	Grender string
}

// 定义一个工厂函数,传入对应参数返回一个Customer类型的指针
func NewCustomer(id int,name string,age int,grender string)*Customer{
	return &Customer{
		Id : id,
		Name : name,
		Age : age,
		Grender : grender,
	}
}

func NewCustomer2(name string,age int,grender string)*Customer{
	return &Customer{
		Name : name,
		Age : age,
		Grender : grender,
	}
}

// 返回结构体字符串格式
func (cu *Customer)Cu()string{
	js := fmt.Sprintf("%v\t%v\t%v\t%v",cu.Id,cu.Name,cu.Age,cu.Grender)
	return js
}
// service层
package service

import (
	"goOctober/demo-10-16/model"
	"fmt"
)

// 定义一个struct定义一个Customer类型的切片用来存放客户信息
type Customerservice struct{
	num int
	customers []model.Customer
}

// 初始化Customerservice结构体及切片
func Init()*Customerservice{
	custvice := &Customerservice{}
	oms := model.NewCustomer(1,"hello",2,"hh")
	custvice.num = 1
	custvice.customers = append(custvice.customers,*oms)
	return custvice
}

// 返回这个切片
func (Cumer *Customerservice)Recustomer()[]model.Customer{
	return Cumer.customers
}

// 为切片追加参数
func (cce *Customerservice)Adduser(cust model.Customer){
	cce.num ++
	cust.Id = cce.num
	cce.customers = append(cce.customers,cust)
}

// 根据用户传入的值查找下标
// func (findbyid *Customerservice)Sele(id int)int{
// 	index := -1
// 	for i:=0;i<len(findbyid.customers);i++{
// 		if i == index{
// 			break 
// 		}
// 	}
// 	return id
// }

// 根据下标干掉对应切片元素
// 这里进行后端校验
func (de *Customerservice)Delete(index int){
	// index := de.Sele(id)
	index2 := 10
	p := fmt.Sprint("%T",index)
	g := fmt.Sprint("%T",index2)
	if index > len(de.customers) || index < 0 || p != g{
		fmt.Println("输入有误请重新选择服务...")
		return
	}else{
		de.customers = append(de.customers[:index],de.customers[index+1:]...)
	}
}

//view层
package main

import (
	"fmt"
	"goOctober/demo-10-16/service"
	"goOctober/demo-10-16/model"
)

type Views struct{
	addservice *service.Customerservice
	tag int
	food bool
}

// 添加客户信息方法
func (ad *Views)add(){
	fmt.Println("请输入用户名")
	name := ""
	fmt.Scanln(&name)
	fmt.Println("请输入年龄")
	age := 0
	fmt.Scanln(&age)
	fmt.Println("请输入性别")
	grender := ""
	fmt.Scanln(&grender)

	vscode := model.NewCustomer2(name,age,grender)
	ad.addservice.Adduser(*vscode)
}

// 查看客户信息方法
func (ad *Views)view(){
	fmt.Printf("ID\t姓名\t年龄\t性别\t\n")
	vw := ad.addservice.Recustomer()
	for k,_ := range vw{
	fmt.Println(vw[k].Cu())
	}
}

// 删除功能
// 在这里进行前端校验
func (de *Views)delete(){
	fmt.Println("请输入你要删除的用户id")
	ider := 0
	fmt.Scanln(&ider)
	de.addservice.Delete(ider)
}

func (vs Views)list(){
	for{
		fmt.Println("--------MRPII信息管理系统--------")
		fmt.Println("		  1 添加客户信息")
		fmt.Println("		  2 删除客户信息")
		fmt.Println("		  3 修改客户信息")
		fmt.Println("		  4 查看客户列表")
		fmt.Println("		  5 退出系统服务")
		fmt.Println("请选择需要的服务1-5")
		fmt.Scanln(&vs.tag)
		switch vs.tag{
		case 1:
			fmt.Println("--------添加客户信息--------")
			vs.add()
		case 2:
			fmt.Println("--------删除客户信息--------")
			vs.delete()
		case 3:
			fmt.Println("--------修改客户信息--------")
		case 4:
			fmt.Println("--------查看客户列表--------")
			vs.view()
		case 5:
			fmt.Println("--------退出系统服务--------")
			vs.food = true
		default :
			fmt.Println("输入有误")
		}
		if vs.food != false{
			break
		}
	}
}

func main(){
	var v Views
	v.addservice = service.Init()
	v.list()
}

最终实现:

// model层
package model

import (
	"fmt"
)

type Customer struct{
	Id int
	Name string
	Age int
	Grender string
}

// 定义一个工厂函数,传入对应参数返回一个Customer类型的指针
func NewCustomer(id int,name string,age int,grender string)*Customer{
	return &Customer{
		Id : id,
		Name : name,
		Age : age,
		Grender : grender,
	}
}

func NewCustomer2(name string,age int,grender string)*Customer{
	return &Customer{
		Name : name,
		Age : age,
		Grender : grender,
	}
}

// 返回结构体字符串格式
func (cu *Customer)Cu()string{
	js := fmt.Sprintf("%v\t%v\t%v\t%v",cu.Id,cu.Name,cu.Age,cu.Grender)
	return js
}
// service层
package service

import (
	"goOctober/demo-10-16/model"
	// "fmt"
)

// 定义一个struct定义一个Customer类型的切片用来存放客户信息
type Customerservice struct{
	num int
	customers []model.Customer
}

// 初始化Customerservice结构体及切片
func Init()*Customerservice{
	custvice := &Customerservice{}
	oms := model.NewCustomer(1,"hello",2,"hh")
	custvice.num = 1
	custvice.customers = append(custvice.customers,*oms)
	return custvice
}

// 返回这个切片
func (Cumer *Customerservice)Recustomer()[]model.Customer{
	return Cumer.customers
}

// 为切片追加参数
func (cce *Customerservice)Adduser(cust model.Customer){
	cce.num ++
	cust.Id = cce.num
	cce.customers = append(cce.customers,cust)
}

// 根据下标干掉对应切片元素
// 前端进行校验
func (de *Customerservice)Delete(index int){
	de.customers = append(de.customers[:index-1],de.customers[index:]...)
}
//view层
package main

import (
	"fmt"
	"goOctober/demo-10-16/service"
	"goOctober/demo-10-16/model"
)

type Views struct{
	addservice *service.Customerservice
	tag int
	food bool
}

// 加一个遍历客户列表id的方法,用来进行校验
func (pd *Views)pdd(){
	gd := pd.addservice.Recustomer()
	for 
}

// 添加客户信息方法
func (ad *Views)add(){
	fmt.Println("请输入用户名")
	name := ""
	fmt.Scanln(&name)
	fmt.Println("请输入年龄")
	age := 0
	fmt.Scanln(&age)
	fmt.Println("请输入性别")
	grender := ""
	fmt.Scanln(&grender)

	vscode := model.NewCustomer2(name,age,grender)
	ad.addservice.Adduser(*vscode)
}

// 查看客户信息方法
func (ad *Views)view(){
	fmt.Printf("ID\t姓名\t年龄\t性别\t\n")
	vw := ad.addservice.Recustomer()
	for k,_ := range vw{
	fmt.Println(vw[k].Cu())
	}
}

// 删除功能
// 在这里进行前端校验
func (de *Views)delete(){
	fmt.Println("请输入你要删除的用户id")
	ider := 0
	ider2 := 0
	fmt.Scanln(&ider)
	i := fmt.Sprintf("%T",ider)
	d := fmt.Sprintf("%T",ider2)

	if ider > len(de.addservice.Recustomer()) || ider <= 0 || d != i{
		fmt.Println("输入有误请重新选择服务...")	
	}else{
		de.addservice.Delete(ider)
		fmt.Println("--------删除成功!--------")
	}
}

// 完善退出功能
func (qu *Views)quit(){
	fmt.Println("确定要退出吗? Y/N")
	quit := ""
	fmt.Scanln(&quit)
	for{
		if quit == "y" || quit == "Y" || quit == "n" || quit == "N"{
			break
		}else{
			fmt.Println("输入有误")
			qu.quit()
			// 这里需要加一个return否则会一直递归调用
			return
		}
	}

	if quit == "y" || quit == "Y"{
		fmt.Println("退出成功!")
		qu.food = true
	}else{
		return
	}
}

// 修改用户信息
// 调用model返回一个Customer类型的结构体并赋值给service/Recustomer
func (up *Views)update(){
	fmt.Println("请输入你要修改的用户信息ID")
	up1 := 0
	up2 := 0
	fmt.Scanln(&up1)
	i := fmt.Sprintf("%T",up1)
	d := fmt.Sprintf("%T",up2)

	if up1 > len(up.addservice.Recustomer()) || up1 <= 0 || i != d{
		fmt.Println("输入有误请重新选择服务...")	
	}else{
		fmt.Println("请输入用户名")
		name := ""
		fmt.Scanln(&name)
		fmt.Println("请输入年龄")
		age := 0
		fmt.Scanln(&age)
		fmt.Println("请输入性别")
		grender := ""
		fmt.Scanln(&grender)
		id := up1-1
		up.addservice.Recustomer()[id] = *model.NewCustomer(up1,name,age,grender)
	}
}

func (vs Views)list(){
	for{
		fmt.Println("--------MRPII信息管理系统--------")
		fmt.Println("		  1 添加客户信息")
		fmt.Println("		  2 删除客户信息")
		fmt.Println("		  3 修改客户信息")
		fmt.Println("		  4 查看客户列表")
		fmt.Println("		  5 退出系统服务")
		fmt.Println("请选择需要的服务1-5")
		fmt.Scanln(&vs.tag)
		switch vs.tag{
		case 1:
			fmt.Println("--------添加客户信息--------")
			vs.add()
		case 2:
			fmt.Println("--------删除客户信息--------")
			vs.delete()
		case 3:
			fmt.Println("--------修改客户信息--------")
			vs.update()
		case 4:
			fmt.Println("--------查看客户列表--------")
			vs.view()
		case 5:
			fmt.Println("--------退出系统服务--------")
			// vs.food = true
			vs.quit()
		default :
			fmt.Println("输入有误")
		}
		if vs.food != false{
			break
		}
	}
}

func main(){
	var v Views
	v.addservice = service.Init()
	v.list()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值