我有一个小问题,每次我在对我的问题进行更改后运行 'go run >filename<' 时,都需要几秒钟才能开始执行。
我用这样一个简单的程序试了一下:
package main
import "fmt"
func main() {
fmt.Println("Output")
}
Run Code Online (Sandbox Code Playgroud)
大约需要 18 秒才能打印出结果。
关于什么可能导致这个问题的想法?
顺便说一下,我在窗户上。
提前致谢
小智 10
在 MacOS (OSX) Catalina 上遇到与新编译的 golang 二进制文件相同的问题时发现了这一点。
简而言之,操作系统现在会扫描一个新的(针对它的)二进制文件以查找恶意软件,它通常在第一次启动时执行,但我发现它连续执行了 3-5 次,之后该二进制文件被列入白名单并作为普通的。显然,一旦您对代码进行更改并重新编译,扫描就会再次发生。扫描将花费 20 秒以上,这破坏了 golang 的快速迭代周期。
我的解决方案如下:
sudo spctl developer-mode enable-terminal
Run Code Online (Sandbox Code Playgroud)
然后转到首选项 -> 安全和隐私 -> 隐私
在左侧的列表中,您现在将拥有“开发人员工具”部分,其中将列出 OSX 内置终端。选中该框以启用它,和/或添加您可能用于开发的任何其他内容(iTerm、VS Code 等)
从这些应用程序运行二进制文件时,扫描会停止,一切恢复正常。
$ go run命令总是将代码编译到临时二进制文件中,然后在每次运行时执行它。
要解决这个问题,您可以将$ go build -i main.go依赖项单独编译为.a文件(我猜这是花费最长的部分,因为构建依赖项需要时间),然后使用 执行它$ ./main,并且每次执行应该比$ go run.
您还可以运行 a$ go get -u ./...来更新所有 deps,并使用 -x 标志构建将显示工具链是否发现不兼容的版本。
$ go install在临时目录中构建命令,然后将其移动到 $GOPATH/bin ,以便您可以在没有路径的情况下执行它$ main。
如果代码发生更改,最后两个命令需要重建/重新安装。