EDIT:
Чтобы создать группу 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.
Вы можете определить переменные URL в urls.go
, а затем логику в views.go
(или другой файл в package moduleX
) до тех пор, как они имеют одинаковую package
декларацию.
Например:
// 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, как я могу создать для них маршрут с соответствующим обработчиком? Я хочу сделать все HandleFunc() - stuff в модулеX/urls.go, а затем «использовать» эти маршрутизаторы (или маршруты или HandleFuncs?) В start.go. С помощью одного модуля я мог бы просто определить маршрутизатор в urls.go и использовать их в start.go, но с несколькими модулями мне нужен способ «добавить» к маршрутизатору. – Subito
Создайте карту URL-адресов для 'http.HandlerFunc', затем создайте функцию для инициализации всех этих файлов как 'mux.Route'? – Intermernet
Хорошо, теперь я сделал что-то вроде этого: 'Func GetRoutes() [] {core.Route \t маршрутов: = [] {core.Route \t \t core.Route {URL: "/ новый /", Handler: NewObjHandler }, \t \t core.Route {URL: "/", Handler: login.LoginFirst (ListObjHandler)}, \t} \t обратные маршруты } 'в моем urls.go и' obj_routes: = obj.GetRoutes() \t s:. = r.PathPrefix ("/ объект /") Subrouter() \t для _, маршрут: = диапазон obj_routes { \t \t s.HandleFunc (route.URL, route.Handler) \t} '- который работает, но выглядит уродливым. И я не знаю, как я могу применить '.Methods (« POST »)' от gorillas mux. – Subito