2013-07-22 1 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

클로저를 사용하십시오.

응용 프로그램에서 /에 색인을 변경 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))

인덱스 기능이 (가) HandleFunc 유형에 맞는 또한 종료 익명 함수를 반환 해당 변수에 대한 처리기 액세스 권한을 부여 할 때 전달 된 db 값 이상.

+0

완벽하게 작동합니다. 감사! – Jason

관련 문제