編輯:
要一氣呵成打造一批mux.Route
的,你可以定義(在下面的例子中handler
)的自定義類型,不這樣做:
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
)
type handler struct {
path string
f http.HandlerFunc
methods []string
}
func makeHandlers(hs []handler, r *mux.Router) {
for _, h := range hs {
if len(h.methods) == 0 {
r.HandleFunc(h.path, h.f)
} else {
r.HandleFunc(h.path, h.f).Methods(h.methods...)
}
}
}
// create some example handler functions
func somePostHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "POST Handler")
}
func someHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Normal Handler")
}
func main() {
//define some handlers
handlers := []handler{{path: "/", f: somePostHandler, methods: []string{"POST"}}, {path: "/", f: someHandler}}
r := mux.NewRouter()
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./templates/static/"))))
// Initialise the handlers
makeHandlers(handlers, r)
http.Handle("/", r)
http.ListenAndServe(":8080", nil)
}
Playground
原來的答案:
,如果他們在你第不需要import
他們e same package。
可以在urls.go
只要它們具有相同的package
聲明定義URL變量,然後在views.go
邏輯(或package moduleX
另一個文件)。
例如:
// moduleX/urls.go
package moduleX
var (
urls = []string{"http://google.com/", "http://stackoverflow.com/"}
)
然後:
// moduleX/views.go (or some other file in package moduleX)
package moduleX
func GetUrls() []string {
return urls
}
然後:
// start.go
package main
import (
"fmt"
"myapp/moduleX"
)
func main() {
for _, url := range moduleX.GetUrls() {
fmt.Println(url)
}
}
或者,更簡單,從moduleX
包通過給它一個大寫的導出變量名稱。
例如:
// moduleX/urls.go
package moduleX
var URLs = []string{"http://google.com/", "http://stackoverflow.com/"}
然後:
// start.go
package main
import (
"fmt"
"myapp/moduleX"
)
func main() {
for _, url := range moduleX.URLs {
fmt.Println(url)
}
}
看一看any of the Go source to see how they handle the same problem。一個很好的例子是the SHA512
source,其中冗長的變量存儲在sha512block.go
中,並且邏輯在sha512.go
中。
那工作,我知道這是可能的 - 但它不直接解決我的問題。即使我將所有URL導出到start.go,我如何使用適當的Handler爲它們創建一個Route?我想做所有HandleFunc() - moduleX/urls.go中的東西,然後在start.go中「使用」這些路由器(或Routes或HandleFuncs?)。有了一個模塊,我可以在urls.go中定義路由器並在start.go中使用它們,但是對於多個模塊,我需要一種「附加」到路由器的方法。 – Subito
創建一個URL到'http.HandlerFunc's的映射,然後創建一個函數將所有這些初始化爲'mux.Route's? – Intermernet
好了,現在我做了這樣的事:'FUNC GetRoutes()[] {core.Route \t路線:= [] {core.Route \t \t core.Route {URL: 「/新/」,處理程序:NewObjHandler }, \t \t core.Route {URL: 「/」,處理程序:login.LoginFirst(ListObjHandler)}, \t} \t返回路線 }'我urls.go和'obj_routes:= obj.GetRoutes() \t S:= r.PathPrefix( 「/ OBJ /」)Subrouter() \t爲_,路線:=範圍obj_routes { \t \t s.HandleFunc(route.URL,route.Handler) \t}' - 它工作,但看起來很醜。我不知道如何從大猩猩多路複用器上應用'.Methods(「POST」)'。 – Subito