2

新しいパッケージを作成して http go コードを「コントローラー」に分離しようとしていますが、db タイプをハンドラーに渡す方法がわかりません。main.go で作成した Db 型を index.go の Index ハンドラに渡せるようにしたいと考えています。これがこれを解決するための間違った方法である場合は、より良い方法を教えてください (私は勉強しながら学んでいるので、今のところはシンプルに保ちたいと思っています)。これまでの私のコード:

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", "root@/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!")

}

ありがとう!

4

1 に答える 1

11

閉鎖を使用します。

app/c で Index を次のように変更します。

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 型に適合する匿名関数を返し、渡された db の値を閉じて、ハンドラーがその変数にアクセスできるようにします。

于 2013-07-22T03:01:00.547 に答える