下面是一个简要的客服系统,主要是演示分层计。。
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 %v %v %v %v %v ",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 %v %v %v %v %v ",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("编号 姓名 性别 年龄 电话 邮箱") 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(' ') 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 ",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( "末知错误") } }