1 回答

TA貢獻1831條經(jīng)驗 獲得超10個贊
超級簡單?一個全局var db *sql.DB對象。*sql.DB是線程安全的,因此可以并發(fā)訪問。
或者,您可以在包裝*sql.DB. 我的觀點是func (u *User) FindByID(id string) (*User, error)沒有多大意義——你接受一個用戶指針,但返回一個指向用戶的新指針?
作為一個簡化的示例,您可以將代碼更改為類似于以下內(nèi)容:
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.
}
為了從您的處理程序調用這些函數(shù),您可以:
使用閉包(就像你現(xiàn)在所做的那樣)
定義一個“環(huán)境”或“服務”結構,其中包含您的
DB
類型或只是 vanilla*sql.DB
作為字段,并在此基礎上創(chuàng)建您的處理程序作為方法。這也可以是全局的(注意任何成員都必須是線程安全的)。定義一個自定義處理程序類型(我的方法),您可以在其中調用
router.GET("/user/:id", GetUserByID(env)
而不是使用閉包。
- 1 回答
- 0 關注
- 279 瀏覽
添加回答
舉報