1 回答
TA贡献1831条经验 获得超10个赞
超级简单?一个全局var db *sql.DB对象。*sql.DB是线程安全的,因此可以并发访问。
或者,您可以在包装*sql.DB. 我的观点是func (u *User) FindByID(id string) (*User, error)没有多大意义——你接受一个用户指针,但返回一个指向用户的新指针?
作为一个简化的示例,您可以将代码更改为类似于以下内容:
type DB struct {
*sql.DB
}
func NewDB(host, port string) (*DB, error) {
db, err := sql.Open(...)
if err != nil {
return nil, err
}
return &DB{db}, nil
}
func (db *DB) UserByID(id string) (*User, error) {
res, err := db.Query(...)
// etc.
}
func (db *DB) UsersList(limit int) ([]*User, error) {
res, err := db.Query(...)
// etc.
}
为了从您的处理程序调用这些函数,您可以:
使用闭包(就像你现在所做的那样)
定义一个“环境”或“服务”结构,其中包含您的
DB
类型或只是 vanilla*sql.DB
作为字段,并在此基础上创建您的处理程序作为方法。这也可以是全局的(注意任何成员都必须是线程安全的)。定义一个自定义处理程序类型(我的方法),您可以在其中调用
router.GET("/user/:id", GetUserByID(env)
而不是使用闭包。
- 1 回答
- 0 关注
- 249 浏览
添加回答
举报