正如go run成为的语言scripts.我想知道是否可以将go run代码作为脚本运行,而不编译它,是否有可能这样做?
更新:动机(因为有关于动机的问题),取自如何使用Scala作为脚本语言
问题您希望在Unix系统上使用Scala作为脚本语言,替换您在Unix shell(Bourne Shell,Bash),Perl,PHP,Ruby等中编写的其他脚本.
更新:我想知道我可以"滥用" scripting多少能够go run运行多少代码,就像go run编译一样(我喜欢它编译)但它看起来scripts可以给我机会替换go run,即在服务器上有源文件和在被编译时运行它们作为源,scripting但我仍然管理源而不是可执行文件.
更新:另外看了gorun
gorun - Go源文件的类似脚本的运行器.
更新:虽然有一个动机和工具试图解决不能作为脚本运行,我不会去它,+我被告知它没有生产准备好,并被建议不要在生产中使用它,因为它不是生产就绪,这是出于它的目的,并且需要转移脚本的便利性go run.(我没有任何反对编译,静态类型,我是它的忠实粉丝,但想要类似于脚本方便的东西).
我不是go的专家,但你可以做这样的事情.我知道这不优雅,但可能是开始的东西:)
~$ cat vikas.go
//usr/bin/env go run "$0" "$@"; exit
package main
import "fmt"
func main() {
fmt.Printf("Hello World\n")
}
~$
~$ ./vikas.go
Hello World
~$
Run Code Online (Sandbox Code Playgroud)
在 Linux 上绝对可能,支持 cf: https: //blog.cloudflare.com/using-go-as-a-scripting-language-in-linux
如果您不想使用已经提到的“shebang”,它可能有限制:
//usr/bin/env go run "$0" "$@"; exit "$?"
Run Code Online (Sandbox Code Playgroud)
改为这样做:
# check if binfmt_misc is already active
# (should already be done through systemd)
mount | grep binfmt_misc
# if not already mounted
sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
# get gorun and place it so it will work
go get github.com/erning/gorun
sudo mv $GOPATH/bin/gorun /usr/local/bin
# make .go scripts being run with `gorun` wrapper script
echo ':golang:E::go::/usr/local/bin/gorun:OC' | sudo tee /proc/sys/fs/binfmt_misc/register
Run Code Online (Sandbox Code Playgroud)
这仅用于一次性测试。为了使这一点持久化,我将其作为我的倒数第二行/etc/rc.local:
echo ':golang:E::go::/usr/local/bin/gorun:OC' | tee /proc/sys/fs/binfmt_misc/register 1>/dev/null
Run Code Online (Sandbox Code Playgroud)
如果您在开发脚本期间遇到类似“缓存”问题,请查看/tmp/gorun-$(hostname)-USERID.
我喜欢bash,但是一旦您需要适当的数据结构(bash 数组和关联数组由于不可用而不算在内),您就需要另一种语言。对于我来说,Golang 的编写速度比 Python 更快,并且上面描述的任何 golang 设置都适合我。无需与 python 2 与 3 进行较量,其库和 pip 恐怖,可以随意分发二进制文件,并且能够立即更改小型一次性脚本的源代码,这就是为什么这种方法绝对有其优点。
正如其他人指出的那样,Go是一种编译语言。用Go语言编写的程序依赖于Go运行时,该运行时已添加到可执行二进制文件中。
Go运行时提供了某些重要功能,例如垃圾收集,goroutine调度,运行时反映等。没有它们,Go应用程序将无法如语言规范所保证的那样工作。
一个理论去解释将不得不模仿这些功能,这实质上意味着包括Go运行时和围棋编译器。没有这样的事情,也没有必要。
还要注意,如果代码尚未编译,则意味着Go解释器将必须包含所有标准库,因为Go“脚本”可以合法地引用标准库中的任何内容(当编译Go应用时,只有它使用/引用的代码被编译成可执行二进制文件)。
要快速测试某些内容,只需使用go run,它还会编译您的应用程序并在一个临时文件夹中构建可执行二进制文件,启动该临时文件并在应用程序退出时清理它。
其他人发布的“解决方案”可能像脚本一样“感觉”,但是它们无非是自动化/隐藏将Go源代码编译为可执行二进制文件然后启动该二进制文件的过程。这就是这样go run做的目的(它也会清理临时二进制文件)。