3

I've started Go and am trying to follow this tutorial. Everything builds correct but as I try to run it, I get the error that makeRouter() could not be found.

I had a look at some other questions, like this one, and checked the docs, but I couldn't find out whats wrong with my setup.

My folder structure:

.../wattagebazooka/
  |- wattagebazooka.go
  |- router.go
  |- handler.go

Code

wattagebazooka.go
package main

import (
    "database/sql"
    "fmt"
    "log"
    "net/http"
    "runtime"

    _ "github.com/lib/pq"
)

// init sets runtime settings.
func init() {
    // Verbose logging with file name and line number
    log.SetFlags(log.Lshortfile)

    // Use all CPU cores
    runtime.GOMAXPROCS(runtime.NumCPU())
}

var db *sql.DB

func main() {
    db = openDB()
    defer db.Close()

    r := makeRouter()
    http.Handle("/", r)
}

func openDB() *sql.DB {
    dbName := "wattagebazooka"

    db, err := sql.Open("postgres", fmt.Sprintf("user=ts password= dbname=%s host=127.0.0.1", dbName))
    if err != nil {
        log.Fatalf("Error connecting to the %s database as user ts: %v", dbName, err)
    }

    return db
}
router.go
package main

import "github.com/gorilla/mux"

func makeRouter() *mux.Router {
    r := mux.NewRouter()
    r.HandleFunc("/user/me", wrapHandler(userHandler)).Methods("GET")
    r.HandleFunc("/text", wrapHandler(textHandler)).Methods("POST")
    r.HandleFunc("/text/{hash}", wrapHandler(textHashHandler)).Methods("GET")
    return r
}

Build

> Environment:
>   GOROOT=/usr/local/go
>   GOPATH=/Users/ts/Developments/gocode
> Directory: /Users/ts/Developments/gocode/src/github.com/wattagebazooka/wattagebazooka
> Command: /usr/local/go/bin/go build -v
> Output:
github.com/wattagebazooka/wattagebazooka
> Elapsed: 0.708s
> Result: Success

Run

> Environment:
>   GOROOT=/usr/local/go
>   GOPATH=/Users/ts/Developments/gocode
> Directory: /Users/ts/Developments/gocode/src/github.com/wattagebazooka/wattagebazooka
> Command: /usr/local/go/bin/go run -v /Users/ts/Developments/gocode/src/github.com/wattagebazooka/wattagebazooka/wattagebazooka.go
> Output:
command-line-arguments
# command-line-arguments
./wattagebazooka.go:28:7: undefined: makeRouter
> Elapsed: 0.244s
> Result: Error
Thomas Schwärzl
  • 9,518
  • 6
  • 43
  • 69

1 Answers1

10

When you run your program via go run you need to add all source files to the command.

In your case, you only have wattagebazooka.go but are missing router.go and handler.go.

Oliver
  • 11,857
  • 2
  • 36
  • 42