我正在玩Google Go,我很开心(!),但我在使用包子系统时遇到了一些问题。
我在Mac OS X Lion上运行 Go 1.0.1 。我还构建了各种单个文件程序而没有任何问题(我还使用html / templates构建一个小的webapp而没有任何问题,它编译并运行时没有任何错误。)
我已经定义了一个“可重用”的包(even.go):
package even
func Even(i int) bool {
return i % 2 == 0
}
func Odd(i int) bool {
return i % 2 == 1
}
和消费者计划(useeven.go):
package main
import (
"./even"
"fmt"
)
func main() {
a := 5
b := 6
fmt.Printf("%d is even %v?\n", a, even.Even(a))
fmt.Printf("%d is odd %v?\n", b, even.Odd(b))
}
但是当我使用
编译“库”时go build even.go
我什么都没有......没有错误,没有消息......会发生什么?
我该怎么做?
答案 0 :(得分:11)
你的问题的答案,“我该怎么做?”在How to Write Go Code.中解释了这是非常重要的东西,值得一看。
go build
的行为可能看起来令人费解,但实际上对于命令行程序来说是常规的 - 没有输出意味着程序成功运行。那它做了什么?为此,您的答案在go help build
...否则build会编译包但丢弃结果, 仅用作检查包装是否可以构建。
什么,你想要更多?当然。 “如何编写Go代码”解释了这样做的好方法。为了快速修复程序,我将解释go命令期望每个包和每个可执行程序都在一个单独的目录中。如果你只是在useeven.go的位置下创建一个名为even的目录,并将even.go移动到它,那么go run useeven.go
应该就像你拥有它一样。
答案 1 :(得分:3)
go build
仅在构建"单个主包时生成输出文件"。如果要为其他包输出文件,则应使用go install
。这将构建并将该软件包安装到您的pkgs
目录。
答案 2 :(得分:0)
此处未生成输出的原因是因为您正在运行
go build even.go
package 中的命令,而不是 main go文件中的
命令。在软件包上执行此操作将检查软件包上的错误,但是由于它不是带有输出的主文件,因此不会生成成功消息。如果软件包的内容有问题,将显示错误,否则,如果编译良好将没有输出
相反,您应该运行:
go build useeven.go
要创建二进制文件,然后执行二进制文件并从程序中获取输出:
./useeven
答案 3 :(得分:0)
如OP的评论中所述,将go build
放在其自己的文件夹go run useeven.go
中之后,even.go
和./even/even.go
可以正常工作。 ./
(在导入中)中有一些 Go magic (变魔术),它可以自动构建“本地软件包”版本,而无需将其安装在任何地方。
useeven/
├── even
│ └── even.go
└── useeven.go
如果您想在没有魔术./
的情况下完成这项工作,则需要安装该库。为项目执行此工作的一种快捷方法(冒着污染库名称空间的风险)是使用这样的符号链接简单地注册库的源位置(在此示例中,GOPATH
是{ {1}}):
~/go
现在,在构建程序时,它会自动执行[ useeven ]
$ ln -s $(pwd)/even ~/go/src
以安装库的最新版本。
请注意,这无法使go get even
*在图书馆工作,而只是使此工作变得不必要。
如果您不着急的话,还有更多惯用的方法:How to import local packages in go?