如何 "go run" 主包中包含多个文件的项目?

How can I "go run" a project with multiple files in the main package?

我在 main 包中有一个名为 main.go 的文件。因为代码不可重用,所以我想将部分代码放在不同的文件中,但放在同一个包中。

如何在不创建单独包的情况下将 main.go 的内容拆分为多个文件?

我想要这样的目录结构:

ls foo

# output:
main.go
bar.go
package main

import "fmt"

func Bar() {
  fmt.Println("Bar")
}
package main

func main() {
  Bar()
}

当我 运行 go run main.go 时,它给我:

# command-line-arguments
./main.go:4:2: undefined: Bar

2019 年 7 月 26 日更新(适用于 go >=1.11)

go run .

也将在 windows 上工作。

原始答案(针对非 windows 环境)

代码确实有效。问题是我应该 运行:

而不是 运行ning go run main.go
go run *.go

2018 年 8 月更新,Go 1.11, a section "Run" 状态:

The go run command now allows a single import path, a directory name or a pattern matching a single package.
This allows go run pkg or go run dir, most importantly go run .


原始答案 2015 年 1 月

如“How to compile Go program consisting of multiple files?", go run 中所述,需要一个文件列表,因为它 "compiles and runs the main package comprising the named Go source files"。
所以你当然可以用 go run.

将你的 main 包分成几个文件

这与 go build/go install 不同,后者需要包名(而不是文件名)。
一个简单的 go build 将生成一个以父文件夹命名的可执行文件。

请注意,作为 illustrated by this thread, a go run *.go wouldn't work in a Windows CMD session, since the shell doesn't do wildcard expansion

对于 Windows 安装 Cygwin 并使用它代替命令提示符。 "go run *.go" 就可以了。

如前所述,您可以说 go run *.go 但对于 Windows 您可以只列出脚本文件(因为 *.go 将不起作用)- go run main.go other.go third.go

如果您尝试使用最新版本 (1.11) 中的 gorilla mux 在本地主机上 运行 多个文件。尝试使用以下 2 个命令中的任何一个。

  1. go install && FolderName -port 8081 .

  2. go build && ./FolderName -port 8081.

在终端中执行命令之前,请确保您位于源文件夹中,即 go/src/FolderName。

在我看来,这个问题的最佳答案隐藏在置顶答案的评论中。

就运行这个:

go run .

这将 运行 主包中的所有文件,但 不会 给出类似

的错误消息
go run: cannot run *_test.go files (main_test.go)

感谢@BarthesSimpson

第一个方法是 运行

go run *.go

另一种方法是生成exe文件

go build

然后运行那个.exe文件

./filename.exe