Issue
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?
Solution
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.
go run ./cmd/web
also works.
Update:
If you’re in the same directory of main.go
, just use:
go run .
Answered By – Kamol Hasan
Answer Checked By – Senaida (GoLangFix Volunteer)