定义实体
通过struct 定义实体
// 用户实体
type User struct {
// 主键
Id int
// 用户登录名
Username string
// 登录密码
Password string
}
模拟存储
定义一个存储接口,包含增删改查接口
// 用户存储接口
type UserStore interface {
// 根据ID获取用户
Get(id int) (*domain.User, error)
// 获取所有用户
Gets() ([]*domain.User, error)
// 持久化用户
Save(u *domain.User) error
// 更新用户
Update(u *domain.User) error
// 删除用户
Delete(id int) error
}
实现存储接口
// 实现UserStore接口
type UserStoreImpl struct {
// 用map 模拟存储数据库
db map[int] *domain.User
}
func (userStore *UserStoreImpl) Get(id int) (*domain.User, error) {
user := userStore.db[id]
return user, nil
}
func (userStore *UserStoreImpl) Gets() ([]*domain.User,error ) {
users := make([]*domain.User,len(userStore.db))
for _, v := range userStore.db {
users = append(users,v)
}
return users,nil
}
func (userStore *UserStoreImpl) Save(u *domain.User) error {
userStore.db[u.GetId()] = u;
return nil
}
func (userStore *UserStoreImpl) Update(u *domain.User) error {
userStore.db[u.GetId()] = u;
return nil
}
func (userStore *UserStoreImpl) Delete(id int) error {
delete(userStore.db, id)
return nil
}
添加一个构造函数,在函数中初始化一条数据,便于测试
// 构造函数
func NewUserStore() *UserStoreImpl {
userStore := &UserStoreImpl{}
userStore.db = map[int]*domain.User{}
//添加测试数据
user := new(domain.User)
user.SetId(1)
user.SetUsername("Lily")
userStore.db[1] = user
return userStore
}
实现接口
这里业务简单,省去了业务层编码,直接在接口存调用存储
func main() {
http.HandleFunc("/users", usersHandler)
http.ListenAndServe(":8000", nil)
}
func usersHandler(w http.ResponseWriter, req *http.Request) {
if req.Method == "GET" {
idStr := req.URL.Query().Get("id")
if idStr=="" {
w.Write([]byte("未传ID参数"));
return
}
userStore := store.NewUserStore()
id,_ := strconv.Atoi(idStr)
user,_ := userStore.Get(id)
fmt.Print(user)
b,_ := json.Marshal(user)
w.Write(b)
} else if req.Method == "POST" {
//TODO 保存
} else if req.Method == "PUT" {
// TODO 修改
} else if req.Method == "DELETE" {
// TODO 删除
}
}
至此,运行程序,打开浏览器 访问 http://localhost:8000/users?id=1 即可查看用户信息