Go Web Service – Undefined type has no field or method

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)

Leave a Reply

Your email address will not be published.