问题
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.gopackage 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
回答1:
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
.
来源:https://stackoverflow.com/questions/46645061/go-undefined-function-in-same-package