107

我有一个由三个文件组成的小程序,它们都属于同一个包(主)。但是当我这样做时go build main.go,构建没有成功。当它只有一个文件 ( main.go) 时,一切正常。

现在我花了一些精力来分离代码,看起来编译器无法找到取出main.go并放入这两个其他文件(与 main.go 位于同一目录中)的内容。这会导致undefined 'type'错误。

如何编译这个由多个文件组成的程序?

4

7 回答 7

93

新方式(推荐):

请看一下这个答案

旧方式:

假设您正在编写一个名为 myprog 的程序:

将所有文件放在这样的目录中

myproject/go/src/myprog/xxx.go

然后添加myproject/go到 GOPATH

并运行

go install myprog

这样,您就可以根据需要在 myproject/go/src 中添加其他包和程序。

参考: http: //golang.org/doc/code.html

(这个文档总是被新人错过,并且一开始经常被误解。它应该得到 Go 团队 IMO 的最大关注)

于 2012-05-31T17:43:19.840 回答
70

例如,当您将代码从main.gointo 中分离出来时,您只需将该文件也more.go传递给go build// go rungo install

所以如果你以前跑过

go build main.go

你现在简直

go build main.go more.go

作为进一步的信息:

go build --help

状态:

如果参数是 .go 文件的列表,则 build 将它们视为指定单个包的源文件列表。


请注意go buildgo install不同之处go run在于前两个状态期望包名称作为参数,而后者期望go files。但是,前两个也将像 go install 一样接受 go 文件。

如果您想知道:build 将只是build包/文件,install将在您的 GOPATH 中生成对象和二进制文件,run并将编译和运行您的程序。

于 2012-06-03T16:46:58.350 回答
38

Since Go 1.11+, GOPATH is no longer recommended, the new way is using Go Modules.

Say you're writing a program called simple:

  1. Create a directory:

    mkdir simple
    cd simple
    
  2. Create a new module:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. Put all your files in that directory.

  4. Finally, run:

    go run .
    
  5. Alternatively, you can create an executable program by building it:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

For more information, you may read this.

Go has included support for versioned modules as proposed here since 1.11. The initial prototype vgo was announced in February 2018. In July 2018, versioned modules landed in the main Go repository. In Go 1.14, module support is considered ready for production use, and all users are encouraged to migrate to modules from other dependency management systems.

于 2020-05-14T09:25:39.143 回答
32

你也可以只运行

go build

在您的项目文件夹 myproject/go/src/myprog

然后你可以输入

./myprog

运行您的应用程序

于 2014-12-08T18:43:11.293 回答
11

这取决于您的项目结构。但最直接的是:

go build -o ./myproject ./...

然后运行./myproject

假设您的项目结构如下所示

- hello
|- main.go

然后你只需进入项目目录并运行

go build -o ./myproject

然后./myproject在shell上运行。

或者

# most easiest; builds and run simultaneously
go run main.go

假设您的主文件嵌套在一个子目录中,例如cmd

- hello
|- cmd
 |- main.go

然后你会跑

go run cmd/main.go
于 2019-01-26T05:26:06.107 回答
8

您可以使用

go build *.go 
go run *.go

两者都可以使用,您也可以使用

go build .
go run .
于 2019-04-16T04:44:38.210 回答
3

是的!这是非常直接的,这就是一揽子策略发挥作用的地方。据我所知,有三种方法。文件夹结构:

GOPATH/src/github.com/abc/myproject/adapter/main.go pkg1 pkg2 警告:adapter 只能包含包 main 和 sun 目录

  1. 导航到“适配器”文件夹。跑:
    go build main.go
  1. 导航到“适配器”文件夹。跑:
    go build main.go
  1. 导航到 GOPATH/src 识别包 main 的相对路径,这里是“myproject/adapter”。跑:
    go build myproject/adapter

exe文件将在您当前所在的目录中创建。

于 2019-06-25T16:05:20.803 回答