我是Go的新手。我非常喜欢这种语言,但是我很快意识到,由于程序大小增加,我需要开始分割文件。
go run main.go
(main.go已成为我的main()函数的文件)
没有工作,我遇到了障碍,因为我不知道如何使程序正常工作。
一些快速搜索使我找到了答案
go run main.go other.go ..
通过键入package main
包含的所有文件的位置,我可以使程序运行。但是,每次这样做都非常麻烦且令人沮丧。
我写了以下自我回答的问题,以防止像我这样的人可能再次遇到这个障碍。
作为Nate Finch注释:
开始运行……实际上仅意味着可以在非常小的程序上使用,这些程序通常只需要一个文件。
即使在unix上,go run *.go
通常也不正确。在任何具有单元测试的项目中(每个项目都应具有单元测试),这将产生错误:
go run: cannot run *_test.go files (something_test.go)
它还将忽略构建限制,因此_windows.go
文件将在Unix上编译(或尝试编译),这不是您想要的。
[bit of discussion使go run
像其余的go
命令一样工作,并且有一个开放的CL(5164)。 Go 1.4目前正在考虑中。同时,在所有平台上推荐的解决方案是:
go build && ./<executable>
对于尝试将go run
与go generate
结合使用的人们,可以使用以下解决方案:
//go:generate sh -c "go run path/*.go"
对于窗口,以下工作:打开cmd,然后转到文件夹所在的路径。然后键入以下命令,然后按Enter。
go build
此可执行文件将被创建。然后在命令提示符下调用可执行文件。如果您的可执行文件名为Project.exe,则键入以下内容,然后按Enter:
Project.exe
Unix相关系统
go run *.go
在大多数情况下就足够了。
如果导致错误,请继续下面的方法。
Windows系统(以及在其他情况下,go run *.go
不起作用)
令牌扩展在Windows命令行中不起作用,因此以上内容将不起作用并显示错误。由于当前的编译器限制,在某些情况下,go run *.go
也可能无法在操作系统中使用。
在这些情况下,使用
go build && foo.exe
其中foo.exe
是所生成的.exe文件的名称。如果您可能不知道可执行文件的名称,请首先
go build
并检查生成的.exe文件的名称。然后,使用包含文件名的方法。
这两种方法将以最小的麻烦构建并运行当前目录中的所有.go文件。
您可以使用此bash构造运行除测试以外的所有.go
文件:
go run $(ls -1 *.go | grep -v _test.go)
最佳方法是像这样运行它:
go run !(*_test).go
它会跳过所有测试文件,而这正是避免错误所需要的。
另一个建议:
go build && ./<executable>
有点烦人。您必须一直删除可执行文件,以免被git标记。您可以将它放在gitignore中,但是我很懒,这是一个额外的步骤。
如果我正确理解您的问题,则需要导入其他代码作为库。
小例子
./ testing / main.go:
package main
import "fmt"
import L "testing/lib"
func main() {
fmt.Println("Hello from main()")
L.Somefunc()
}
./ testing / lib / somelib.go:
package lib
import "fmt"
func Somefunc() {
fmt.Println("Hello from Somefunc()")
return
}
要启动-go run main.go
仅使用此
go run *.go
假设您没有任何测试文件,它将正常工作
这是我的解决方法:
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
在Windows上,我通常只向我的所有项目目录中添加一个test.bat:
go build
.\{project_name}.exe
go clean
效果很好。当然,将{project_name}替换为可执行文件的名称。可执行文件完成后,批处理脚本将继续进行清理。