未定义:带有多路复用器的应用程序

Posted

技术标签:

【中文标题】未定义:带有多路复用器的应用程序【英文标题】:Undefined: App with mux 【发布时间】:2017-11-14 02:41:07 【问题描述】:

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

我似乎找不到错误,因为 Initialize and run 应该足以启动服务器。教程也有这个样子,我仔细照着做。

更新:

作为澄清,我尝试使用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);

【问题讨论】:

【参考方案1】:

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

go run main.go app.go

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

go run *.go

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

go build -o app && ./app

【讨论】:

是的,抱歉,我将编辑我的帖子以提供我确实使用该命令运行它的信息。我尝试了您的解决方案并遇到了其他一些问题,我将更新我的问题。 您的意思是getUsers 结构的App 方法吗?如果是,请尝试在其他方法中将其称为a.getUsers。还是定义了另一个 go 文件?如果是这样,他们也可以go run。即使是* getUsers 在我的 app.go 文件中定义,因此它应该使用它运行。我尝试使用go run *.go,但它给了我一个*.go: The filename, directory name, or volume label syntax is incorrect. 的错误,对不起,对这个话题缺乏了解。我来自 javascript 背景,我一直在尝试阅读我能找到的所有指南,但一段时间后文档变得模糊。 别担心。我们已经开始了一段时间:)。是整个文件吗?我只看到在结构上定义的方法,但没有看到具有此类参数的独立函数。 哦,是的,对不起,我掌握了结构。我可能还有 4 个类似的函数,比如那个(get、post、put、delete)风格,它们看起来几乎都一​​样,参数相同,所以我猜所有的方法都在结构上。我可以将它们全部放在问题中,但我觉得这只会使代码混乱,因为它们在定义上看起来相同。【参考方案2】:

只需添加到@Eugene Lisitsky's answer。

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

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

正如您所看到的,这很快就会变得非常烦人,因此最好将您的所有应用程序代码以及 main.go 文件之外的所有其他代码放入单独的包中,然后使用 main.go 文件。去导入这些包,然后你应该可以使用go run main.go 运行你的应用程序。

【讨论】:

【参考方案3】:

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

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

那没关系!

【讨论】:

以上是关于未定义:带有多路复用器的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Axios 发布请求正文未使用多路复用器服务器解析

使用 select 多路复用未命名管道和其他文件描述符

计算机科学中的术语多路复用是啥意思?

TCP的多路复用和分解

多路复用I/O select()

RPi Pyaudio/Portaudio + ALSA:如何选择/更改多路复用器输入