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

时间:2014-05-16 12:52:15

标签: go command-line-interface

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

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

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

一些快速搜索引导我回答

go run main.go other.go ..

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

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

12 个答案:

答案 0 :(得分:62)

Nate Finch所述:

  

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

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

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

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

bit of discussion使go run与其他go命令一样工作,并且有一个开放的CL(5164)。 Go 1.4目前正在考虑中。与此同时,所有平台上推荐的解决方案是:

go build && ./<executable>

答案 1 :(得分:20)

Unix相关系统

在大多数情况下,

go run *.go就足够了。

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

Windows系统(以及go run *.go不起作用的其他情况)

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

在这些情况下,请使用

go build && foo.exe

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

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

这两种方法将以最小的麻烦构建并运行当前目录中的所有.go文件。

答案 2 :(得分:16)

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

go run !(*_test).go

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

另一个建议:

go build && ./<executable>

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

答案 3 :(得分:16)

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

go run $(ls -1 *.go | grep -v _test.go)

答案 4 :(得分:4)

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

小例子

<强> ./测试/ main.go:

package main

import "fmt"
import L "testing/lib"

func main() {
    fmt.Println("Hello from main()")
    L.Somefunc()
}

<强> ./测试/ LIB / somelib.go:

package lib

import "fmt"

func Somefunc() {
    fmt.Println("Hello from Somefunc()")
    return
}

启动 - go run main.go

答案 5 :(得分:2)

只需使用此

go run *.go 

假设你没有任何测试文件

答案 6 :(得分:2)

这是我的解决方案:

go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)

我将它与别名一起使用,以便于运行命令行应用

alias gorun='go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)'

$ gorun param1 param2

答案 7 :(得分:2)

最后我们可以使用:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    recyc.layoutManager = LinearLayoutManager(this)
    val adapter = MyAdapter(
        arrayOf("sd","sd2","sd2","sd2","sd2","s2d","s2d","sd",
            "sd2","s2d","s2d","sd5","s8d","67sd","s76d")
    )
    recyc.adapter = adapter
}

感谢: https://github.com/golang/go/issues/22726#issuecomment-345841019

答案 8 :(得分:1)

在Windows上我通常只是在我的所有项目目录中添加一点 test.bat

go build
.\{project_name}.exe
go clean

运作良好。当然,将{project_name}替换为可执行文件的名称。一旦可执行文件完成,批处理脚本就会继续进行清理。

答案 9 :(得分:0)

对于尝试结合使用go rungo generate的人们,解决方案可以是:

//go:generate sh -c "go run path/*.go"

答案 10 :(得分:0)

如果您在 Windows 上的 Vscode 终端中运行并且不了解工作区,请执行以下操作:

go run $(ls *.go)

答案 11 :(得分:-1)

对于窗口,以下工作: 打开cmd,然后转到文件夹所在的路径。然后键入以下命令,然后按Enter。

go build

在此一个可执行文件之后将被创建。然后在命令提示符下调用可执行文件。 如果您的可执行文件名为Project.exe,则键入以下内容,然后按Enter:

Project.exe