在简单的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吗?只有一个文件假设有主?
答案 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。