由于go
正在成为system
的语言。我想知道是否有可能将go
代码作为脚本运行,而不编译它,是否有可能这样做?
更新:从How to use Scala as a scripting language采取的动机(因为有动机的问题)
问题您希望在Unix系统上使用Scala作为脚本语言,替换您在Unix shell(Bourne Shell,Bash),Perl,PHP,Ruby等中编写的其他脚本。
更新:我想知道有多少我可以“滥用”go run
能够有很多go
代码运行作为scripts
虽然编译(我喜欢它编译)但它看起来像go run
可以给我机会取代scripting
,这是有服务器上的源文件,并在由go run
编译时作为源运行,但我仍然管理源而不是可执行文件。
更新:另外看到gorun
gorun - Go源文件的类似脚本的运行器。
更新:虽然有一个动机和工具试图解决不能作为脚本运行,我不会去它,+我被告知它没有生产准备好,并被建议不要在生产中使用它,因为它不是生产就绪,这是出于它的目的,并且需要倾向于脚本方便,有利于go
。 (我没有任何反对编译,静态类型,我是它的忠实粉丝,但想要类似于脚本方便的东西)。
我不是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
~$
见Neugram, Go scripting。从它的文档:
#!/usr/bin/ng
// Start a web server to serve files.
import "net/http"
pwd := $$ echo $PWD $$
h := http.FileServer(http.Dir(pwd))
http.ListenAndServe(":8080", h)
正如其他人所说,Go是一个compiled language。用Go语言编写的程序依赖于Go运行时,它被添加到可执行二进制文件中。
Go运行时提供了一些重要的功能,例如垃圾收集,goroutine调度,运行时反射等。没有它们,Go应用程序无法像语言规范那样起作用。
理论上的Go解释器必须模拟这些功能,这实际上意味着包含Go运行时和Go编译器。没有这样的东西,也没有必要。 另请注意,如果代码尚未编译,则意味着Go解释器必须包含所有标准库,因为Go“脚本”可以合法地引用标准库中的任何内容(当编译Go应用程序时,只有东西它使用/引用被编译成可执行二进制文件)。
要快速测试某些内容,只需使用go run
,它还会编译您的应用并在临时文件夹中构建可执行二进制文件,启动该临时文件并在您的应用退出时清除它。
其他人发布的“解决方案”可能“感觉”像脚本一样,但它们只不过是自动化/隐藏将Go源编译为可执行二进制文件然后启动该二进制文件的过程。这正是go run
所做的(它也清理了临时二进制文件)。
在linux上绝对可能,cf:https://blog.cloudflare.com/using-go-as-a-scripting-language-in-linux的道具
如果你不想使用已经提到的可能有限制的'shebang':
//usr/bin/env go run "$0" "$@"; exit "$?"
改为:
# 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
这仅适用于一次性测试。为了使这个持久,我把它作为我的qazxsw poi中的第二行:
/etc/rc.local
如果您在开发脚本期间遇到类似“缓存”的问题,请查看echo ':golang:E::go::/usr/local/bin/gorun:OC' | tee /proc/sys/fs/binfmt_misc/register 1>/dev/null
。
我喜欢/tmp/gorun-$(hostname)-USERID
,但只要你需要一个合适的数据结构(bash数组和关联数组由于不可用性而无法计算),你需要另一种语言。对我来说Golang写得比python更快,如上所述的任何golang设置都适合我。没有战斗python 2 vs 3,它的libs和pip恐怖,随意都有一个可分发的二进制文件,并且能够立即改变小型一次性脚本的源代码,这就是为什么这种方法肯定有它的好处。
不,这既不可能也不可取。