我的main.go文件无法查看其他文件

时间:2016-04-17 00:57:36

标签: go

在简单的Web应用程序中,我需要帮助了解文件布局的错误。

$GOPATH/src/example.com/myweb

然后我有2个文件:

$GOPATH/src/example.com/myweb/main.go
$GOPATH/src/example.com/myweb/api.go

两个文件都有:

package main

api.go文件如下所示:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "time"
)

type API struct {
    URI   string
    Token  string
    Secret string
    client *http.Client
}

...

我的main.go文件如下:

package main

import (
    "github.com/gorilla/mux"
    "html/template"
    "net/http"
)

var (
    templates = template.Must(template.ParseFiles("views/home.html", "views/history.html", "views/incident.html"))
    api = API{
        URI: "http://localhost:3000",
        Token: "abc",
        Secret: "123",
    }
)

func renderTemplate(w http.ResponseWriter, tmpl string, hp *HomePage) {
..
..
}

func WelcomeHandler(w http.ResponseWriter, r *http.Request) {
..
..
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", WelcomeHandler)
    r.PathPrefix("/assets/").Handler(
        http.StripPrefix("/assets/", http.FileServer(http.Dir("assets/"))))

    http.ListenAndServe(":9000", r)
}

在我排除的代码中,我基本上使用在我的api.go文件中定义的结构,并且在执行时出现此错误:

go run main.go
# command-line-arguments
./main.go:16: undefined: API
./main.go:23: undefined: User

我到底错在了什么?

我尝试将api.go中的软件包名称更改为myweb,但这没有帮助。

我想使用包名myweb吗?只有一个文件假设有主?

2 个答案:

答案 0 :(得分:1)

您只编译main.go文件。你应该使用:

go run main.go api.go

或者:

go run *.go

如果您正在编写复杂的应用程序,则可以将所有内容添加到子目录中的包中,并且只有一个main.go文件。例如,etcd有一个etcdmain子目录/包以及其他子目录/包。类似的东西:

/alarm    
/auth
/cmd
/etcdmain
...

main.go文件只是:

package main

import "github.com/coreos/etcd/etcdmain"

func main() {
    etcdmain.Main()
}

答案 1 :(得分:1)

您正在使用golang工作区项目,该项目适用于您的应用程序的结构,并且它也是标准化的。

当我们使用golang工作区时,您无法运行单个go文件。你需要调用go build / go install。

安装

go install example.com/myweb

上面的命令将在example.com/myweb上编译您的主程序包。 myweb可执行二进制文件将放在GOPATH / bin上。你可以手动运行它。

<强>构建

go build example.com/myweb

该命令类似于go install,但是当您调用命令时,二进制可执行文件将放在当前目录中,而不是放在GOPATH / bin上(除非您的当前目录是GOPATH / bin)。

有关详细信息,请查看this link