3 回答

TA貢獻(xiàn)1966條經(jīng)驗 獲得超4個贊
我喜歡使用的一種模式是定義您自己的Router結(jié)構(gòu),該結(jié)構(gòu)具有一個mux.Router字段,并封裝諸如您的數(shù)據(jù)庫連接、應(yīng)用程序配置等內(nèi)容。
我發(fā)現(xiàn)這樣做可以在需要不同資源和開發(fā)收益時輕松更新您的路線。
首先創(chuàng)建一個路由器對象,它在創(chuàng)建時接收數(shù)據(jù)庫連接,并使其可用于您希望使用的所有路由。
路由器.go
package main
import (
"net/http"
"database/sql"
"github.com/gorilla/mux"
)
type Router struct {
router *mux.Router
db *sql.DB
}
func NewRouter(db *sql.DB) (*Router, error) {
router := mux.NewRouter()
router.StrictSlash(true)
subrouter := router.PathPrefix("/api").Subrouter()
r := &Router{
router: router,
db: db,
}
subrouter.HandleFunc("/factors", r.GetFactors).Methods(http.MethodGet)
return r, nil
}
func (r *Router) GetFactors(w http.ResponseWriter, req *http.Request) {
// Now you can access your database via `r.db`
}
// Needed so we can pass our custom router to ListenAndServe.
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
r.router.ServeHTTP(w, req)
}
然后main.go你可以簡單地創(chuàng)建你的自定義路由器,將它傳遞給你的數(shù)據(jù)庫連接。然后自定義路由器可以直接傳遞給ListenAndServe.
主程序
package main
import (
"log"
"net/http"
"rest_api/configurations"
"rest_api/controllers"
)
func main() {
db, err := configurations.PostgreSQLDatabase()
if err != nil {
log.Fatal(err)
}
router, err := NewRouter(db)
if err != nil {
log.Fatalf("error initializing router: %v", err)
}
log.Fatal(http.ListenAndServe(":8000", router))
}
希望這會有所幫助。

TA貢獻(xiàn)1900條經(jīng)驗 獲得超5個贊
沒有正確的方法,它主要基于意見。
HandlerFunc 函數(shù)的語義應(yīng)該是這樣的func(w http.ResponseWriter, r *http.Request),為了傳遞數(shù)據(jù)庫,你可以使用閉包,這里是一個例子。
主程序
// ... some code here
subrouter.HandleFunc("/factors", controllers.GetFactors(db)).Methods("GET")
// ... some code here
控制器/factors.go
func GetFactors(db *sql.DB) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
// some code
})
}
另外一個選擇:
我不太確定這一點,但你可以根據(jù)你的需要調(diào)整它。初始化一個Controller結(jié)構(gòu)并將數(shù)據(jù)庫傳遞給它:
主程序
// ... some code here
db, err := configurations.PostgreSQLDatabase()
if err != nil {
log.Fatal(err)
}
ctrl := controllers.Controller{DB: db}
subrouter.HandleFunc("/factors", ctrl.GetFactors).Methods("GET")
// ... some code here
表示 Controller 結(jié)構(gòu)上的方法。在控制器中定義一個結(jié)構(gòu)
控制器/factors.go
type Controller struct {
DB *PostgreSQLDatabase
}
func (c Controller) GetFactors(w http.ResponseWriter, req *http.Request) {
// some code
// c.DB.MySqlMethod()
}

TA貢獻(xiàn)1862條經(jīng)驗 獲得超7個贊
您的功能GetFactors必須如下所示:
func GetFactors(w http.ResponseWriter, r *http.Request) {}
在主文件中你必須有:
subrouter.HandleFunc("/factors", controllers.GetFactors).Methods("GET")
為了獲得數(shù)據(jù)庫連接,你必須GetDB在你的包中有類似的功能"rest_api/configurations"。
在"rest_api/configurations"你必須有類似的東西:
var db *PostgreSQLDatabase
func init() {
var err error
db, err = configurations.PostgreSQLDatabase()
if err != nil {
log.Fatal(err)
}
}
func GetDB() *PostgreSQLDatabase {
return db
}
- 3 回答
- 0 關(guān)注
- 188 瀏覽
添加回答
舉報