所以我有一个由三个文件组成的小程序,都属于同一个包(main),但是当我"go build main.go"时,构建不成功。 当它只是一个文件(main.go)时一切正常。 现在我花了一些力气来分离代码,看起来编译器无法找到从main.go中取出的东西并放入这两个其他文件(与main.go位于同一目录)。 这导致"未定义'类型'"错误。
我读了一些关于设置GOPATH变量的内容,所以我试过了
1 2 | set GOPATH=%cd% go build main.go |
但那也行不通。
任何帮助表示赞赏。
假设您正在编写一个名为myprog的程序:
将所有文件放在这样的目录中
1 | myproject/go/src/myprog/xxx.go |
然后将
并运行
1 | go install myprog |
这样,如果需要,您将能够在myproject / go / src中添加其他包和程序。
参考:http://golang.org/doc/code.html
(这个文档总是被新手错过,并且一开始常常不明白。它应该得到Go团队IMO的最大关注)
- 确实,我忽略了一个非常有用的章节。谢谢!
- 为什么不摆脱/ go /并只是做myproject / src?
- 另外,我假设"go install myprog"以某种方式将项目源写入$ GOPATH位置?那正确吗?如果是这样的话,将这个解释作为答案的一部分也会很高兴
- @AlexanderMills只有小型项目只使用一种技术。
- @DenysSguret不确定我是否同意这一点,但无论如何这是为了简单的项目,你可以放弃去的部分 - 人们可能会认为这件事是必要的而不是。你告诉我,哪个更简单,更好还是不走? :)
将代码从
所以,如果你以前跑过
1 | go build main.go |
你现在简单
1 | go build main.go more.go |
作为进一步信息:
1 | go build --help |
状态:
1 2 | If the arguments are a list of .go files, build treats them as a list of source files specifying a single package. |
请注意,
如果您想知道:build只是
- 如果您不想继续添加越来越多的文件,请使用正则表达式:go run * .go
- 好的,谢谢,Go总是只写出一个可执行文件吗?它不会将可执行文件分开(就像在Java中一样)?
- go build * .go,那有用吗?不适合我
- @AlexanderMills因为windows,我认为,使用nix。或至少mingw。
- 是的我使用MacOS,但也许它的Bash版本3搞砸了,我应该升级到Bash 4。
你也可以跑
1 | go build |
在项目文件夹myproject / go / src / myprog中
然后你可以输入
1 | ./myprog |
运行你的应用程序
- 输出是go对象,而不是可执行文件。
-
@ user2284570只需为该文件添加
chmod +x 权限即可运行它
这取决于您的项目结构。但最直截了当的是:
1 | go build ./... -o ./myproject |
然后运行
假设您的项目结构如下所示
1 2 | - hello |- main.go |
然后你只需转到项目目录并运行
1 | go build -o ./myproject |
然后在shell上运行
要么
1 2 | # most easiest; builds and run simultaneously go run main.go |
假设您的主文件嵌套在像
1 2 3 | - hello |- cmd |- main.go |
然后你会跑
1 | go run cmd/main.go |
-
谢谢
-o 参数帮助了我
您可以使用
1 2 | go build *.go go run *.go |
你也可以使用它们
1 2 | go build . go run . |
对!这是非常直接的,这就是包策略发挥作用的地方。我的知识有三种方式。
文件夹结构:
GOPATH / src目录/
github.com/
ABC /
我的项目/
适配器/
main.go
则pkg1
则pkg2
警告:适配器只能包含package main和sun目录
1 | go build main.go |
1 | go build main.go |
识别包main的相对路径,这里是"myproject / adapter"。跑:
1 | go build myproject/adapter |
exe文件将在您当前所在的目录中创建。