2016-12-17 6 views
1

Mux를 사용하여 간단한 Go REST API를 작성 중입니다. 내가 찾은 튜토리얼의 대부분은 다음과 같이 라우터를 만드는 제안 :Go에서 중앙 객체에 대한 경로 등록

  • 모든 경로 모든 경로 처리기의 글로벌 배열을 포함하는 routes.go 파일.
  • router.go 라우터 개체를 만들고 전역 배열을 반복하며 라우터에 모든 항목을 등록하는 파일입니다.
차라리 다른 모델을 사용하십시오

하십시오 router.go 파일이 API의 다른 객체 또는 구성 요소를 나타내는, 라우터 객체를 인스턴스화하고 RegisterRoute 기능을

  • 각 파일이

    • 을 할 수 RegisterRoute으로 전화를 걸어 라우터에 추가 경로를 추가하십시오. 각 파일에 대한 초기화 함수를 생성하고 (목적을 패배하는) main()에서 호출 요구하는 것 때문에

    나는 어떻게이 일을 아무 생각이 없습니다. 이 작업을 수행 할 수있는 방법이 있습니까?

  • +0

    글쎄, (잘 모르겠지만) 글쎄, 당신의 문제를 이해하면,'func init()'이 당신이 찾고있는 것입니다. – Volker

    답변

    2

    func init()을 사용할 수 있습니다. 패키지를 초기화하는 동안 프로그램 실행 직전에 호출되는 특수 함수입니다.

    다음은 다른 mux 라이브러리를 사용하여 달성 할 수 있지만 gorilla/mux 라우터를 사용하여 원하는 것을 얻는 방법의 예입니다.

    package main 
    
    import (
        "fmt" 
        "log" 
        "net/http" 
    
        "github.com/gorilla/mux" 
    ) 
    
    // main.go 
    
    type Route struct { 
        Name  string 
        Method  string 
        Pattern  string 
        HandlerFunc http.HandlerFunc 
    } 
    
    var routes []Route 
    
    func registerRoute(route Route) { 
        routes = append(routes, route) 
    } 
    
    func main() { 
        router := mux.NewRouter().StrictSlash(false) 
        for _, route := range routes { 
         router. 
          Methods(route.Method). 
          Path(route.Pattern). 
          Name(route.Name). 
          Handler(route.HandlerFunc) 
        } 
    
        if err := http.ListenAndServe(":8080", router); err != nil { 
         log.Fatalln(err) 
        } 
    } 
    
    // index.go 
    func init() { 
        registerRoute(Route{ 
         "index", 
         "GET", 
         "/", 
         func(w http.ResponseWriter, r *http.Request) { 
          fmt.Fprintf(w, "welcome") 
         }, 
        }) 
    } 
    
    // users.go 
    func init() { 
        registerRoute(Route{ 
         "listUsers", 
         "GET", 
         "/users", 
         listUsers, 
        }) 
    } 
    
    func listUsers(w http.ResponseWriter, r *http.Request) { 
        fmt.Fprintf(w, "users list") 
    } 
    
    // products.go 
    func init() { 
        registerRoute(Route{ 
         "listProducts", 
         "GET", 
         "/products", 
         listProducts, 
        }) 
    } 
    
    func listProducts(w http.ResponseWriter, r *http.Request) { 
        fmt.Fprintf(w, "products list") 
    } 
    

    이 패턴은

    database/sqlimage 패키지가 예를 들어 golang 의해 사용된다. 이것에 대해 좀 더 자세히 읽을 수 있습니다 : https://www.calhoun.io/why-we-import-packages-we-dont-actually-use-in-golang/