I am trying to consolidate routing functionality within a web service. The package main has two files of concern, route.go
and main.go
.
Within route.go
I am defining routing as follows:
package main
import (
"github.com/justinas/alice"
"net/http"
)
func (app *Application) Routes() http.Handler {
standardMiddleware := alice.New(app.logRequest)
mux := http.NewServeMux()
mux.HandleFunc("/ping", helpers.Ping)
return standardMiddleware.Then(mux)
}
Within main.go
I am trying to execute the application as follows:
package main
import (
"flag"
"log"
"net/http"
"os"
)
type Application struct {
errorLog *log.Logger
}
func main() {
addr := flag.String("addr", ":8080", "HTTP Network Address")
flag.Parse()
errorLog := log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile)
app := &Application{
errorLog: errorLog,
}
srv := &http.Server{
Addr: *addr,
ErrorLog: errorLog,
Handler: app.Routes(),
}
err := srv.ListenAndServe()
errorLog.Fatal(err)
}
When I execute the program I get the following error: app.Routes undefined (type *Application has no field or method Routes)
I'm not sure why the method isn't registering correctly?
Try using:
go run cmd/web/main.go cmd/web/route.go
go run
takes file or files as input. It compiles only those file or files before running. So you need to add route.go
file as input otherwise the method you declared in it, will be undefined.