对于一般的管理系统,分为数据层,控制层,应用层三个模块。数据层就是底层数据结构定义和封装,控制层就是对底层数据封装后提供的一些控制操作,应用层就是上层用户的处理。
举例来说:
下面是一个书本对象结构体,就是最底层的数据结构,封装了新建和获取两个接口。
package bookdata
import (
"fmt"
)
type Book struct {//定义一个书本结构体对象
Id int
Name string
Provider string
}
func NewBook(i int, n string, p string) Book {//封装一个新建对象的接口
return Book{i, n, p}
}
func (b *Book) GetInfo() string {//获取对象的接口
rs := fmt.Sprintf("%v\t%v\t%v\t\n", b.Id, b.Name, b.Provider)
return rs
}
下面是一个控制层的服务接口,提供了操作书本对象的一系列常用操作,添加,删除,打印等。
package booksrv
import (
"fmt"
"../bookdata"
)
type BookSrv struct {//封装到一个管理结构体,用于对书本对象进行管理。
books []bookdata.Book//定义一个书本对象的切片
booknum int//切片中的数目
}
func NewBookSrv() *BookSrv {//返回一个管理对象。
bks := &BookSrv{}
return bks
}
func (bks *BookSrv) Print() ([]bookdata.Book, int) {//返回切片和对应的数目
return bks.books, bks.booknum
}
func (bks *BookSrv) FindId(id int) int {//根据书本ID查找在切片里的索引
for i, v := range bks.books {
if v.Id == id {
return i
}
}
return -1
}
func (bks *BookSrv) Add(book bookdata.Book) (bool, error) {
if bks.FindId(book.Id) != -1 {
return false, fmt.Errorf("此书本ID已存在,无法添加!")
}
bks.booknum++
bks.books = append(bks.books, book)//往切片里添加一个书本对象
return true, nil
}
func (bks *BookSrv) Del(id int) (bool, error) {
var index int
if index = bks.FindId(id); index == -1 {
return false, fmt.Errorf("此书本ID不存在,无法删除!")
}
bks.booknum--
bks.books = append(bks.books[:index], bks.books[index+1:]...)//从切片里删除指定索引
return true, nil
}
最后就是实际的用户层模块
package main
import (
"fmt"
"../bookdata"
"../booksrv"
)
func main() {
bks := booksrv.NewBookSrv()
book := bookdata.NewBook(1, "学习go语言", "北京精诚出版社")
if b, err := bks.Add(book); !b {
fmt.Println(err)
}
book = bookdata.NewBook(2, "学习c++语言", "中国人民出版社")
if b, err := bks.Add(book); !b {
fmt.Println(err)
}
book = bookdata.NewBook(3, "学习c语言", "北京人民出版社")
if b, err := bks.Add(book); !b {
fmt.Println(err)
}
books, bookn := bks.Print()
for _, v := range books {
fmt.Println(v.GetInfo())
}
fmt.Println("书本数目:", bookn)
if b, err := bks.Del(4); !b {
fmt.Println(err)
}
books, bookn = bks.Print()
for _, v := range books {
fmt.Println(v.GetInfo())
}
fmt.Println("书本数目:", bookn)
}