2017-06-07 46 views
1

在我的API中,我將爲每個路徑有很多完全獨立的處理程序,如「/ api/v1/handler_one」和「/ api/v1/handler_two」。我試圖把每個處理程序放在它自己的包中,以便於維護。在外部程序包中註冊Golang大猩猩/多路複用器路由

我加了一個例子。它不工作,因爲它甚至沒有加載「handlers/handler_one.go」。我錯過了什麼?

main.go

package main 

import (
    "net/http" 
    "git/myapp/router" 
) 

func main() { 

    myRouter := router.APIRouter 

    srv := &http.Server{ 
     Handler: myRouter, 
     Addr: "0.0.0.0:8080", 
    } 

    log.Fatal(srv.ListenAndServe()) 
} 

路由器/ router.go

package router 

import (
    "github.com/gorilla/mux" 
) 

var Router = mux.NewRouter().StrictSlash(true) 
var APIRouter = Router.PathPrefix("/api/v1").Subrouter() 

處理器/ handler_one.go

package handler_one 

import (
    "git/myapp/router" 
) 

type Route struct { 
    Name  string 
    Method  string 
    Pattern  string 
    HandlerFunc http.HandlerFunc 
} 

type APIRoutes []Route 

var apiRoutes = APIRoutes{ 
    Route{ "OneIndex", "GET", "/one", OneIndex, }, 
} 

func init() { 
    // Register routes 
    for _, route := range apiRoutes { 
     var handler http.Handler 

     handler = route.HandlerFunc 
     handler = Logger(handler, route.Name) 

     router.APIRouter. 
      Methods(route.Method).Path(route.Pattern).Name(route.Name).Handler(handler) 
    } 
} 

// OneIndex is handling the requests to /api/v1/one 
func OneIndex(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Type", "application/json; charset=UTF-8") 
    w.WriteHeader(http.StatusOK) 

    fmt.Println("Doing something...") 
} 

回答

1

它不工作,因爲它甚至沒有加載「處理程序/handler_one.go「

您的意思是handlers/handler_one.go中的init函數未被執行?

這是可以預料的,因爲在你粘貼的代碼中你並沒有在任何地方導入這個包。

嘗試導入該包在您的main.go

如果導入它的唯一原因是init函數運行,那麼您可以導入爲_

相關問題