下面是一个简要的客服系统,主要是演示分层计。。

model : 数据部份:

package model

import "fmt"

//声明一个结构体,表示一个客户信息
type Customer struct{
Id int
Name string
Gender string
Age int
Phone string
Emaill string
}
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,
}
} func NewCustomer2(name string, gender string,
age int, phone string,email string) Customer{
return Customer{
Name : name,
Gender : gender,
Age : age,
Phone:phone,
}
}
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.Emaill)
return info
}

控制层,这儿名为服务层 customerService 代码如下:

package model

import "fmt"

//声明一个结构体,表示一个客户信息
type Customer struct{
Id int
Name string
Gender string
Age int
Phone string
Emaill string
}
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,
}
} func NewCustomer2(name string, gender string,
age int, phone string,email string) Customer{
return Customer{
Name : name,
Gender : gender,
Age : age,
Phone:phone,
}
}
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.Emaill)
return info
}

最后是视图层:第一个版本没有加注释,以后有空成全功能后在认真写好注释

package main

import (
"fmt"
"awesomeProject/service"
"awesomeProject/model"
) type customerView struct{
key string
loop bool
customerService *service.CustomerService
}
//显示用户例表
func(this *customerView) list(){
customers:=this.customerService.List()
fmt.Println("——————————————————客户例表————————————————————————————")
fmt.Println("编号 \t 姓名 \t \t性别 \t年龄 \t电话 \t邮箱")
for i:=0; i < len(customers);i++{
fmt.Println(customers[i].GetInfo())
}
fmt.Println("++++++++++++++客户列表完成+++++++++++++++")
}
//jo fi 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 :=model.NewCustomer2(name,gender,age, phone,email)
this.customerService.Add(customer)
}
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"{
if this.customerService.Delete(id){
fmt.Println("____________删 除成功__________________")
}else{
fmt.Println("删 除失败,可能是输入的Id不存在") }
} } func(this *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.Scanln(&this.key)
switch this.key {
case "1":
this.add()
case "2":
fmt.Println("修改用户")
case "3":
this.delete()
case "4":
this.list()
case "5":
this.loop = false
default:
fmt.Println("输入有误 ")
}//switch循环结束
if !this.loop{
break
}//for
}
fmt.Println("你退出了客户系统") }//主函数 func main(){
customerView := customerView{
key: "",
loop : true,
}
customerView.customerService = service.NewcustomerService()
customerView.mainMenu()
}

在练习下一案例前先来复习一下文 件读取和数据库和进程,网络,下一个案例是完整的聊天室

文件读取简单示例:

 1 package main
2
3 import (
4 "os"
5 "fmt"
6 )
7
8 func main(){
9 //打开文件
10 file,err:=os.Open("d:/int1.txt")
11 //如果错误有值的话进入if
12 if err !=nil{
13 fmt.Println("open file err=",err)
14 }
15 //输出语言内容
16 fmt.Printf("file=%v",file)
17 //关闭文 件
18 err = file.Close()
19 //如果关闭错误处理
20 if err != nil{
21 fmt.Println("close file err",err)
22 }
23 }

golang  文 件中    一行一行读取,行读取器实现

 1 package main
2
3 import (
4 "os"
5 "fmt"
6 "bufio"
7 "io"
8 )
9
10 func main(){
11 // 读取文 件显示到终端,会用到os.Open,file.Close,bufio.NewReader(),reader.ReadString等方法:
12 //现在以一个带缓存的读取文件方式,文 件若以流的方式读取文件,每次只读4096字节,也可以设置大小和特殏,比如读到回车
13 //本例实现行读取器,就是一行一行的读
14 file,err:=os.Open("d:/int1.txt")
15 if err !=nil{
16 fmt.Println("open file err=",err)
17 }
18
19 //关闭文件
20 defer file.Close()
21 //先得到一个文 件,在以文 件的流方法处理文 件,bufio和io二个包提前要导入,
22 reader := bufio.NewReader(file)
23 for{
24 // 读到内容放放str,产生的错误放 在err
25 str,err:=reader.ReadString('\n')
26 //有一种错误叫读到最后没有办法在读取了 io.EOF
27 if err != io.EOF{
28 break
29 }
30 fmt.Println(str)
31 }
32 fmt.Println("文 件读取结束")
33 }

一次性读取文 件的方法,可以使用 ioutil 包,不用显示打开文件

package main

import (
"io/ioutil"
"fmt"
)
//本案例没有明确的打开和关闭文件,可以用于较小文件读取
func main(){
// ioutil.ReadFile(file)读取文 件不用打开和关闭,并且一次读取完
file:= "d:/int1.txt"
// 用ioutil方法读取文件
content,err:=ioutil.ReadFile(file)
//外理错误有值的情况。如果错误了会进入if
if err !=nil{
fmt.Println("读取错误,%v",err)
}
//最终打印,当然这儿打印的是句柄地址之类,比如:00 14 58 想要得到真的字符需要转换字符
fmt.Println("%v",content)
// 可以使用字符转义看到文件内容
// fmt.Println("$%v",string(content))
}

文 件读写示例:

package main

import (
"io/ioutil"
"fmt"
) func main(){
filePath1 :="d:/xsy.txt"
filePath2 :="e:/kkk.txt"
data,err :=ioutil.ReadFile(filePath1)
if err !=nil{
fmt.Printf("read file err=%v",err)
return
}
err = ioutil.WriteFile(filePath2,data,0666)
if err != nil{
fmt.Printf("write file error=%v\n",err)
}
}

以下示例一下完整的读写拷贝过程

package main

import (
"os"
"fmt"
"bufio"
"io"
)
//定义一个函数可以通过传参完成复制拷贝文件
func copyfile(dstFileName string, srcFileName string)(Writter int64,err error){
//打开参数的文件
srcFile,err:=os.Open(srcFileName)
//处理错误逻辑
if err !=nil{
fmt.Printf("open err=%v",err)
}
//新建一个读文件句柄
reader :=bufio.NewReader(srcFile)
//定义模式
dstFile,err := os.OpenFile(dstFileName,os.O_WRONLY | os.O_CREATE,0666)
if err !=nil{
//如果错误处理
fmt.Printf("opne file err=%v",err)
return
}
//写文件句柄
writer :=bufio.NewWriter(dstFile)
defer dstFile.Close()
//io 的copy方法最终外理
return io.Copy(writer,reader)
}
func main(){
//得到二个文 件句柄
srcFile :="d:/flower.jpg"
dstFile :="e:/adc.jpg"
//业务处理
_, err := copyfile(srcFile,dstFile)
if err == nil{
fmt.Println("拷拷贝完成")
}else{
fmt.Println( "末知错误")
}
}

最新文章

  1. 其原因可能是堆被损坏,这说明 100BloodCellSegTest.exe 中或它所加载的任何 DLL 中有 Bug。
  2. AngularJS中的指令全面解析(转载)
  3. FastReport自定义数据源及ListView控件的使用
  4. 读匿名object对象的属性值
  5. sqlserver 查看锁表,解锁
  6. registerClassAlias()函数和getClassByAlias()函数
  7. 使用java注解的例子有没有
  8. js字符串比较
  9. 在类库中使用log4net
  10. java之从字符串比较到==和equals方法区别
  11. POI 自用API
  12. 【学习笔记】 使用XML配置和注解实现Spring的依赖注入DI (2-3-2)
  13. 给定 n&#215;n 的实数矩阵,每行和每列都是递增的,求这 n^2 个数的中位数。
  14. 2018申请淘宝客AppKey
  15. FFmpeg使用基础
  16. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
  17. 【Hbase学习之五】HBase MapReduce
  18. Node.js做的代理转发服务器
  19. Javascript短路运算||和&amp;&amp;
  20. 高可用OpenStack(Queen版)集群-6.Nova控制节点集群

热门文章

  1. CentOS帮助类语法
  2. 自己动手实现Lua--实现TAILCALL指令
  3. 【笔记】scikit-learn中的Scaler(归一化)
  4. HTTP状态码关于各个网站的实地调查
  5. QT系列
  6. vs2019 快捷键汇总
  7. 十二:Servlet3.0的注解
  8. Struts2框架基本使用
  9. openCV入门系列教学(一) 图像的读取、展示与保存
  10. Python3-sqlalchemy-orm 创建关联表带外键并插入数据