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

问题描述 投票:8回答:5

由于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
5个回答
6
投票

我不是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
~$

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
投票

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

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

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

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

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


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

这仅适用于一次性测试。为了使这个持久,我把它作为我的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恐怖,随意都有一个可分发的二进制文件,并且能够立即改变小型一次性脚本的源代码,这就是为什么这种方法肯定有它的好处。


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.