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

go run main.go(main.go已成为我的main()函数的文件)

没用,我遇到了障碍,因为我不知道如何使程序正常工作。

一些快速搜索使我找到了答案

go run main.go other.go ..

通过键入package main包含的所有文件,可以使程序运行。 但是,每次这样做都非常麻烦且令人沮丧。

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


内特·芬奇(Nate Finch)指出:

Go run is ... really only meant to be used on very small programs, which generally only need a single file.

即使在UNIX上,go run *.go经常也不正确。在任何具有单元测试的项目中(每个项目都应具有单元测试),这将产生错误:

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

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

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

1
go build && ./<executable>

Unix相关系统

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

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

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

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

在这种情况下,请使用

go build && foo.exe

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

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

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

  • 如何在子文件夹的文件夹下运行* .go?
  • 如果您使用Windows PowerShell,请执行以下操作: 。 foo.exe(而不是&&,而是;(点和逗号))

您可以使用以下bash结构运行所有.go文件(不包括测试):

1
go run $(ls -1 *.go | grep -v _test.go)
  • 这应该是公认的答案。 它为* nix开发人员解决了问题
  • 我喜欢这样,但是将命令设置为别名时,该命令不能很好地播放。 带有shopt!(...)的r.sendeckys解决方案非常有效。

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

1
go run !(*_test).go

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

另一个建议:

1
go build && ./<executable>

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

  • 不起作用" -bash:!:未找到事件"
  • @ user1872384,应先运行shopt -s extglob以启用!(...)通配符语法

最后,我们现在可以使用:

1
go run .

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

  • 这应该是公认的答案
  • 这是最好的和公认的答案

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

小例子

./testing/main.go:

1
2
3
4
5
6
7
8
9
package main

import"fmt"
import L"testing/lib"

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

./testing/lib/somelib.go:

1
2
3
4
5
6
7
8
package lib

import"fmt"

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

要启动-go run main.go

  • 这是Windows开发人员的正确答案。 就我而言,我必须使用完全限定的路径import"github.comabacajhellolib",然后像sc := new(lib.ServiceControl)一样使用它

这是我的解决方案:

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

我将其与别名结合使用,以使其易于运行命令行应用程序

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

$ gorun param1 param2

只是用这个

1
go run *.go

假设您没有任何测试文件,它将正常工作

  • 那绝对是我想要的! 谢谢!
  • 在Windows上将无法使用。 CreateFile *.go: The filename, directory name, or volume label syntax is incorrect.
  • 但是现在,我们可以使用go run。 :)

在Windows上,我通常只向我的所有项目目录中添加一个test.bat:

1
2
3
go build
.\{project_name}.exe
go clean

效果很好。当然,将{project_name}替换为可执行文件的名称。可执行文件完成后,批处理脚本将继续进行清理。


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

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

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

1
go build

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

1
Project.exe