写一个golang中 用户表的service和dao层 使用interface交互
时间: 2023-12-14 22:37:13 浏览: 31
好的,以下是一个使用 interface 交互的 Golang 用户表 service 和 dao 层示例:
```go
// 定义 User 结构体
type User struct {
ID int64
Username string
Password string
}
// UserDao 接口定义
type UserDao interface {
// 添加用户
Insert(user *User) error
// 根据 ID 查询用户
FindByID(id int64) (*User, error)
// 根据用户名查询用户
FindByUsername(username string) (*User, error)
}
// UserService 接口定义
type UserService interface {
// 添加用户
AddUser(username, password string) (*User, error)
// 根据 ID 查询用户
GetUserByID(id int64) (*User, error)
// 根据用户名查询用户
GetUserByUsername(username string) (*User, error)
}
// UserDaoImpl 实现 UserDao 接口
type UserDaoImpl struct {
db *sql.DB
}
func (dao *UserDaoImpl) Insert(user *User) error {
// 插入用户到数据库
}
func (dao *UserDaoImpl) FindByID(id int64) (*User, error) {
// 根据 ID 查询用户
}
func (dao *UserDaoImpl) FindByUsername(username string) (*User, error) {
// 根据用户名查询用户
}
// UserServiceImpl 实现 UserService 接口
type UserServiceImpl struct {
userDao UserDao
}
func (service *UserServiceImpl) AddUser(username, password string) (*User, error) {
user := &User{
Username: username,
Password: password,
}
if err := service.userDao.Insert(user); err != nil {
return nil, err
}
return user, nil
}
func (service *UserServiceImpl) GetUserByID(id int64) (*User, error) {
return service.userDao.FindByID(id)
}
func (service *UserServiceImpl) GetUserByUsername(username string) (*User, error) {
return service.userDao.FindByUsername(username)
}
```
上述代码中,`User` 为用户结构体,`UserDao` 为用户表的 dao 层接口,`UserDaoImpl` 为 `UserDao` 的实现,具体实现了添加用户、根据 ID 查询用户和根据用户名查询用户等方法;`UserService` 为用户表的 service 层接口,`UserServiceImpl` 为 `UserService` 的实现,具体实现了添加用户、根据 ID 查询用户和根据用户名查询用户等方法,其内部使用了 `UserDao` 接口来操作数据库。
这样设计的好处是,`UserService` 和 `UserDao` 之间通过接口进行交互,可以灵活地实现不同的 dao 层和 service 层实现,而不需要修改原有代码,提高了代码的可扩展性。