2013-07-22 38 views
2

我試圖通過爲他們創建一個新程序包來將我的http go代碼分離爲「控制器」,但無法弄清楚如何將db類型傳遞到處理程序。我希望能夠將我在main.go中創建的Db類型傳遞到index.go中的索引處理程序中。如果這是解決這個問題的錯誤方法,讓我知道更好的方法(我正在學習,現在想保持簡單)。到目前爲止我的代碼:如何將類型傳遞到http處理程序

main.go:

package main 

import (

    "database/sql" 
    "fmt" 
    _ "github.com/go-sql-driver/mysql" 
    "github.com/gorilla/mux" 
    "log" 
    "mvc3/app/c" 
    "net/http" 
) 

var Db *sql.DB 

func main() { 

    fmt.Println("Starting up!") 

    var err error 
    Db, err = sql.Open("mysql", "[email protected]/dev?charset=utf8") 
    if err != nil { 
     log.Fatalf("Error on initializing database connection: %s", err.Error()) 
    } 

    Db.SetMaxIdleConns(100) 

    err = Db.Ping() 
    if err != nil { 
     log.Fatalf("Error on opening database connection: %s", err.Error()) 
    } 

    r := mux.NewRouter() 
    r.HandleFunc("/", c.Index) 

    http.Handle("/", r) 
    http.ListenAndServe(":8080", nil) 
} 

/app/c/index.go:

package c 

import (
    "fmt" 
    "net/http" 
) 

func Index(w http.ResponseWriter, r *http.Request) { 

    fmt.Fprintf(w, "Hello world!") 

} 

謝謝!

回答

11

使用閉包。

在app/C更改指數:

func Index(db *sql.DB) http.HandlerFunc { 
    return func(w http.ResponseWriter, r *http.Request) { 
     // do stuff with db here 
     fmt.Fprintf(w, "Hello world!") 
    } 
} 

然後在主函數中使用它像這樣:r.HandleFunc("/", c.Index(db))

INDEX函數返回一個適合的HandleFunc類型,也關閉匿名函數超過傳遞給你的處理程序訪問該變量的數據庫的值。

+0

完美地工作。謝謝! – Jason

相關問題