22

我正在玩 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

我什么都没有……没有错误,没有消息……会发生什么?

我该怎么做?

4

4 回答 4

11

你的问题的答案,“我应该怎么做?” 在如何编写 Go 代码中进行了解释。 这真的是非常重要的东西,值得一看。

的行为go build可能看起来令人费解,但实际上对于命令行程序来说是常规的——没有输出意味着程序运行成功。那么它做了什么?为此,您的答案在go help build

...否则 build 编译包但丢弃结果,仅用作检查包是否可以构建。

什么,你想要更多?当然。“如何编写 Go 代码”解释了这样做的好方法。为了快速修复您的程序,我将解释 go 命令期望每个包和每个可执行程序位于单独的目录中。如果你只是在 useeven.go 的位置下创建一个名为 even 的目录,然后将 even.go 移动到它,那么go run useeven.go应该像你拥有它一样运行。

于 2012-05-02T16:18:18.350 回答
5

go build仅在构建“单个主包”时生成输出文件。如果你想为你的其他包输出一个文件,你应该使用go install. 这将构建该软件包并将其安装到您的pkgs目录中。

于 2014-03-28T22:19:16.567 回答
2

正如 OP 在评论中指出的那样,一旦您放入自己的文件夹,go build就可以正常工作: . (在导入中)有一点Go 魔法它可以自动构建“本地包”,而无需将其安装在任何地方go run useeven.goeven.go./even/even.go./

useeven/
├── even
│   └── even.go
└── useeven.go

如果您想在没有魔法的情况下完成这项工作./,则需要安装该库。使这项工作为您的项目工作的一种快速而肮脏的方法(冒着污染库名称空间的风险)是使用如下符号链接简单地注册库的源位置(在此示例GOPATH中为~/go):

[ useeven ]
$ ln -s $(pwd)/even ~/go/src

现在,当您构建程序时,它会自动执行go get even安装库的最新版本。

Note that this doesn't make go install* work for the library, it just makes doing that unnecessary.


There are more idiomatic ways of doing this, if you're not in a hurry: How to import local packages in go?

于 2019-05-07T01:06:54.263 回答
0

此处未生成输出的原因是因为您正在运行

go build even.go

上的命令,而不是主要的go 文件。对包执行此操作将检查包上的错误,但由于它不是带有输出的主程序,因此不会生成任何成功消息。如果包的内容有问题,则会显示错误,否则如果编译正常则没有输出

相反,您应该运行:

go build useeven.go

要创建二进制文件,然后执行二进制文件并从程序中获取输出:

./useeven
于 2019-03-20T11:23:49.397 回答