如何“运行”主程序包中包含多个文件的项目?


150

我目前在主包中只有一个文件,名为main.go。如何分割内容main.go由于代码不可重用,为多个文件而不创建单独的程序包。

我想要这样的目录结构:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

然后在 main.go

package main

func main() {
    Bar()
}

但是go run main.go给我:

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

Answers:


204

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

go run .

原始答案

上面的代码实际上有效。问题是我需要跑步

go run *.go

代替

go run main.go

6
除非您*_test.go在文件夹中。然后,您需要(1)shopt -s ext glob和(2)go run !(*_test).go
getWeberForStackExchange 2015年

那些使用appengine的人呢?
goodies4uall 2015年

我尝试了go run ./cmd/myCmd/...,对我有用。也许有_test.go文件时这是正确的方法?
VinGarcia,

go run ../your_folder从工作文件夹内部为我工作
Andy

3
go run .
那就

66

更新2018年8月,与围棋1.11,一节“运行”状态:

go run现在,该命令允许使用单个导入路径,目录名称或与单个软件包匹配的模式。
这允许go run pkggo run dir,最重要的是go run .


原答复2015年1月

如“ 如何编译由多个文件组成的Go程序? ”中所述,go run需要一个文件列表,因为它“编译并运行main包含命名的Go源文件的包”。
因此,您当然可以使用以下方式将main软件包拆分为多个文件:go run

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

请注意,如该线程所示,a go run *.go在Windows CMD会话中不起作用,因为外壳程序不进行通配符扩展


1
run使用Windows命令提示符运行多个go文件的解决方法吗?
路加福音

1
谢谢!这帮助了我很多。我一直在想为什么我不能只用main.go来运行代码,因为它是同一个包,但是对于他们为什么不允许这样做,这对我来说还是很有意义的。
克里斯(Chris)

4

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


3

我认为,该问题的最佳答案隐藏在对最高答案的评论中。

只需运行:

go run .

这将运行主程序包中的所有文件,但不会给出错误消息,例如

go run: cannot run *_test.go files (main_test.go)

@BarthesSimpson的荣誉



0

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

  1. 转到install && FolderName -port 8081。

  2. 去建立&& ./FolderName -port 8081。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.