Golang:通过命令行运行当前目录中的所有.go文件(多文件包)

dk1*_*123 47 command-line-interface go

我是Go的新人.我非常喜欢这种语言,但我很快意识到由于程序大小的增加,我需要开始分割文件.

go run main.go (main.go是我的main()函数的文件)

没有工作,我打了一段时间的障碍,因为我不知道如何使我的程序工作.

一些快速搜索引导我得到答案

go run main.go other.go ..

通过键入我所package main包含的所有文件,我可以运行编程.然而,每次这样做都非常麻烦和令人沮丧.

我写了以下自我回答的问题,以防止像我这样可能再次遇到这个障碍的人.

Rob*_*ier 66

正如Nate Finch所说:

Go run is ...真的只适用于非常小的程序,通常只需要一个文件.

即使在unix上,go run *.go也常常不正确.在任何具有单元测试的项目中(并且每个项目都应该有单元测试),这将给出错误:

go run: cannot run *_test.go files (something_test.go)
Run Code Online (Sandbox Code Playgroud)

它也会忽略构建限制,因此_windows.go在Unix上编译(或尝试编译)文件,这不是你想要的.

已经有一些关于go run像其他go命令一样进行工作的讨论,并且有一个开放的CL(5164).Go 1.4目前正在考虑中.与此同时,所有平台上推荐的解决方案是:

go build && ./<executable>
Run Code Online (Sandbox Code Playgroud)


dk1*_*123 22

Unix相关系统

go run *.go 在大多数情况下就足够了.

如果这会导致错误,请继续执行以下方法.

Windows系统(在其他情况下go run *.go不起作用)

令牌扩展在Windows命令行中不起作用,因此上述操作无效并显示错误.go run *.go由于当前的编译器限制,在某些情况下也可能无法在OS中工作.

在这些情况下,使用

go build && foo.exe

其中foo.exe是生成的.exe文件的名称.如果您可能不知道可执行文件的名称是什么,请首先

go build并检查生成的.exe文件的名称.然后,使用包含文件名的方法.

这两种方法将构建并运行当前目录中的所有.go文件,而且操作简单.


Rub*_*n S 19

您可以.go使用此bash构造运行所有文件,不包括测试:

go run $(ls -1 *.go | grep -v _test.go)
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.它解决了*nix开发人员的问题 (4认同)

r.s*_*cky 18

最好的方法是像这样运行它:

go run !(*_test).go
Run Code Online (Sandbox Code Playgroud)

它会跳过所有测试文件,这正是您避免错误所需的.

另一个建议是:

go build && ./<executable>
Run Code Online (Sandbox Code Playgroud)

有点烦人.您必须始终删除可执行文件以避免被git标记.当然,你可以把它放在gitignore,但我很懒,这是一个额外的步骤.

  • 不工作"-bash:!:找不到事件" (6认同)
  • @ user1872384你应该先运行`shopt -s extglob`来启用`!(...)`通配符语法 (2认同)

小智 5

如果我正确理解您的问题,则需要导入其他代码作为库。

小例子

./testing/main.go:

package main

import "fmt"
import L "testing/lib"

func main() {
    fmt.Println("Hello from main()")
    L.Somefunc()
}
Run Code Online (Sandbox Code Playgroud)

./testing/lib/somelib.go:

package lib

import "fmt"

func Somefunc() {
    fmt.Println("Hello from Somefunc()")
    return
}
Run Code Online (Sandbox Code Playgroud)

推出 - go run main.go