是否可以将golang代码作为“脚本”运行?

时间:2017-01-09 07:27:11

标签: go

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。 (我没有任何反对编译,静态打字的东西,我是它的忠实粉丝,但想要类似于编写脚本的东西)。

5 个答案:

答案 0 :(得分:6)

我不是go的专家,但你可以这样做。我知道这不优雅,但可能是开始的事情:)

UPDATE TABLE_B as tb,
(
   SELECT * FROM TABLE_A
)  as ta
SET tb.id = ta.id WHERE tb.name = ta.name;

答案 1 :(得分:4)

正如其他人所说,Go是compiled language。用Go语言编写的程序依赖于Go运行时,它被添加到可执行二进制文件中。

Go运行时提供了一些重要的功能,例如垃圾收集,goroutine调度,运行时反射等。没有它们,Go应用程序无法按照语言规范进行保证。

理论 Go解释器必须模拟这些功能,这实际上意味着包含Go运行时和Go编译器。没有这样的东西,也没有必要 另请注意,如果代码尚未编译,则意味着Go解释器必须包含 all 标准库,因为Go"脚本"可以合法地引用标准库中的任何内容(当编译Go应用程序时,只有它使用/引用的内容被编译成可执行的二进制文件)。

要快速测试某些内容,只需使用go run,它还会编译您的应用并在临时文件夹中构建可执行二进制文件,启动该临时文件并在您的应用退出时清除它。

"解"由他人发布可能"感觉"就像脚本一样,但它们只不过是自动化/隐藏将Go源编译为可执行二进制文件然后启动该二进制文件的过程。这正是go run所做的事情(它也清理了临时二进制文件)。

答案 2 :(得分:4)

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)

答案 3 :(得分:2)

在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

这仅用于一次性测试。为了使这个持久化,我将其作为/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,但是一旦您需要合适的数据结构(bash数组和关联数组由于无法使用而无法计算),就需要另一种语言。 Golang为我编写的代码比python更快,并且上面描述的任何golang设置都会为我做。无需与python 2 vs 3对抗,它的libs和pip恐怖,可以随意分配二进制文件,并且可以立即更改小型一次性脚本的源代码,这就是这种方法肯定有其优势的原因。

答案 4 :(得分:-3)

不,这既不可能也不可取。