未定义:带有 mux 的应用程序

Undefined: App with mux

所以我昨天才开始学习 Go,我一直在学习一个相当简单的教程来创建 restful api。我可以 运行 测试和所有内容,但是当我尝试 运行 应用程序并让它监听一部分时,它给了我 undefined: App.

我似乎找不到其中的错误,因为 Initialize 和 运行 应该足以启动服务器。教程里也有,一模一样,我仔细看了。

更新:

作为说明,我尝试 运行 带有 go run main.go 的程序,这就是提示错误的原因。

我也尝试遵循答案和 运行 go run main.go app.go 的建议,我得到 undefined: getUsers 并且它指向它说 users, err := getUsers(a.DB, start, count) 的那一行。我已将它们添加到下面的 app.go 代码中。

main.go

package main

func main() {
    a := App{}

    a.Initialize("root", "password", "user")

    a.Run(":8080")
}

app.go

package main

import (
    "fmt"
    "log"
    "strconv"
    "encoding/json"
    "net/http"
    "github.com/gorilla/mux"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

type App struct {
    Router *mux.Router
    DB     *sql.DB
}

func (a *App) Initialize(user, password, dbname string) {
    connectionString := fmt.Sprintf("%s:%s@/%s", user, password, dbname)

    var err error

    a.DB, err = sql.Open("mysql", connectionString)

    if err != nil {
        log.Fatal(err)
    }

    a.Router = mux.NewRouter()
    a.initializeRoutes()
}

func (a *App) initializeRoutes() {
    a.Router.HandleFunc("/users", a.getUsers).Methods("GET")
}

func (a *App) Run(addr string) {
    log.Fatal(http.ListenAndServe(addr, a.Router))
}

func (a *App) getUsers(w http.ResponseWriter, r *http.Request) {
    count, _ := strconv.Atoi(r.FormValue("count"))
    start, _ := strconv.Atoi(r.FormValue("start"))

    if count > 10 || count < 1 {
        count = 10
    }

    if start < 0 {
        start = 0
    }

    users, err := getUsers(a.DB, start, count)

    if err != nil {
        respondWithError(w, http.StatusInternalServerError, err.Error())

        return
    }

    respondWithJSON(w, http.StatusOK, users);
}

你运行怎么样呢?如果使用 go run 尝试将所有文​​件传递给它:

go run main.go app.go

或者甚至用星号来捕捉它们:

go run *.go

另一种选择:构建应用程序然后 运行 它:

go build -o app && ./app

只是添加到

如果 *.go 由于某种原因对您不起作用,您将不得不手动列出您的程序所依赖的所有文件。

这意味着除了 main.goapp.go 您还需要列出定义 getUsersrespondWithErrorrespondWithJSON 函数的文件,如果您在其中定义这些函数的文件引用了一些其他标识符,这些标识符在您还需要包含的其他文件中定义,依此类推。

如您所见,这很快就会变得非常烦人,因此将所有应用程序代码以及 main.go 文件之外的所有其他代码放入单独的包中可能是个好主意,然后 main.go 导入这些包,这样你就可以 运行 你的应用 go run main.go.

我也有这个问题。也许我们遵循相同的tutorial。 试试这个:

go build .  // create a file end with ".exe", my file name is "golang.exe"
./golang.exe

那就可以了!