下面是一個簡要的客服系統,主要是演示分層計。。golang
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() }
在練習下一案例前先來複習一下文 件讀取和數據庫和進程,網絡,下一個案例是完整的聊天室ide
文件讀取簡單示例:函數
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 文 件中 一行一行讀取,行讀取器實現oop
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 包,不用顯示打開文件this
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)) }
文 件讀寫示例:spa
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) } }
如下示例一下完整的讀寫拷貝過程3d
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( "末知錯誤") } }