将 .go 文件作为附加参数传递给 `go 运行`

Passing a .go-file as additional argument to `go run`

为了快速破解,我更喜欢使用 go run prog.go ... 而不是先构建可执行文件。但是,我正在处理的程序应该将另一个 go-file 作为参数。因此,go run 和编译后的二进制文件表现不同:

go run prog.go foo.go

将尝试执行两个 go 文件,而

go build prog.go && ./prog foo.go

将正确地将我的文件作为输入(预期行为)。现在我可以像这样传递额外的参数 go run ... -- foo.go,但是由于 -- 文件的位置在 go run prog.go -- foo.go./prog foo.go 之间的 os.Args 中不同.任何简单的解决方案?我想避免进行完整的标志处理。我是不是应该放弃,坚持使用编译版?

这不可能。这是命令的 source

for i < len(args) && strings.HasSuffix(args[i], ".go") {
    i++
}
files, cmdArgs := args[:i], args[i:]

您可以使用 go install 而不是 go build。这会将您的可执行文件放入您的 $GOPATH/bin 文件夹中(我不喜欢将二进制文件放在同一文件夹中,因为有时我会不小心将它添加到 git 中)。不过真的没太大区别。

您可能要考虑的另一个选择是 rerun。每当您更改文件时,它都会自动重新编译和 运行 您的代码:

rerun path/to/your/project foo.go

再次查看我的问题,我必须确定我是否需要多个输入文件。如果没有,我可能只阅读 Stdin 而不是打开文件。