未定义:带有 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.go
和 app.go
您还需要列出定义 getUsers
、respondWithError
和 respondWithJSON
函数的文件,如果您在其中定义这些函数的文件引用了一些其他标识符,这些标识符在您还需要包含的其他文件中定义,依此类推。
如您所见,这很快就会变得非常烦人,因此将所有应用程序代码以及 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
那就可以了!
所以我昨天才开始学习 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.go
和 app.go
您还需要列出定义 getUsers
、respondWithError
和 respondWithJSON
函数的文件,如果您在其中定义这些函数的文件引用了一些其他标识符,这些标识符在您还需要包含的其他文件中定义,依此类推。
如您所见,这很快就会变得非常烦人,因此将所有应用程序代码以及 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
那就可以了!