學習一門語言最好的方式就是通過一個實際的例子,通過這個實體,不僅可以進一步鞏固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","[email protected]")
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 [email protected]
------------------客戶串列------------------
------------------客戶資訊管理軟體------------------
1 添加客戶
2 修改客戶
3 洗掉客戶
4 客戶串列
5 退 出
請選擇(1 - 5):1
------------------添加客戶------------------
姓名:jingxing
性別:女
年齡:21
電話:00000000000
電郵:[email protected]
------------------添加完成------------------
------------------客戶資訊管理軟體------------------
1 添加客戶
2 修改客戶
3 洗掉客戶
4 客戶串列
5 退 出
請選擇(1 - 5):2
------------------客戶串列------------------
編號 姓名 性別 年齡 電話 郵箱
1 紫色飛豬 男 22 00000000000 [email protected]
2 jingxing 女 21 00000000000 [email protected]
------------------客戶串列------------------
------------------修改客戶------------------
請選擇等待修改客戶編號(-1退出):2
確認是否修改(Y/N):n
------------------客戶資訊管理軟體------------------
1 添加客戶
2 修改客戶
3 洗掉客戶
4 客戶串列
5 退 出
請選擇(1 - 5):2
------------------客戶串列------------------
編號 姓名 性別 年齡 電話 郵箱
1 紫色飛豬 男 22 00000000000 [email protected]
2 jingxing 女 21 00000000000 [email protected]
------------------客戶串列------------------
------------------修改客戶------------------
請選擇等待修改客戶編號(-1退出):2
確認是否修改(Y/N):y
姓名(jingxing:)jingxing
性別(女):女
年齡(21):22
電話(00000000000):00000000000
郵箱([email protected]):[email protected]
------------------修改完成------------------
------------------客戶資訊管理軟體------------------
1 添加客戶
2 修改客戶
3 洗掉客戶
4 客戶串列
5 退 出
請選擇(1 - 5):4
------------------客戶串列------------------
編號 姓名 性別 年齡 電話 郵箱
1 紫色飛豬 男 22 00000000000 [email protected]
2 jingxing 女 22 00000000000 [email protected]
------------------客戶串列------------------
------------------客戶資訊管理軟體------------------
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 [email protected]
------------------客戶串列------------------
------------------客戶資訊管理軟體------------------
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獲取到地址,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/27380.html
標籤:Go
下一篇:檔案基本操作
