можно ли запустить код golang как "сценарий"?

As go становится язык system. Интересно, можно ли запустить go код как скрипт, без компиляции, есть ли возможность сделать это?

обновление: Мотивация (как были вопросы по мотивации), взятая из как использовать Scala в качестве языка сценариев

проблема вы хотите использовать Scala в качестве языка сценариев в системах Unix, замена других скриптов, написанных в Unix оболочки (оболочки Bourne, Bash), Perl, PHP, Ruby и др.

обновление: Интересно, сколько я могу "злоупотреблять"go run чтобы иметь возможность иметь много go код работает как scripts хотя скомпилирован (который мне нравится, что его скомпилирован), но он выглядит как go run можете дать мне возможность заменить scripting, то есть иметь исходные файлы на серверах и запускать их в качестве источника при компиляции go run но я все еще управляю источниками, а не исполняемыми файлами.

обновление: кроме того пила!--23-->Горюн

gorun-Script-like runner для исходных файлов Go.

обновление: хотя есть мотивация и инструменты, которые пытались обойти, не будучи в состоянии работать как скрипт, я не пойду на это, +мне сказали, что это не производство готово и было рекомендовано не использовать его в производстве, потому что это не производство готово, это из его цели и нужно было бы сбросить удобство сценариев в пользу go. (У меня нет что-нибудь против компиляции, статического ввода, Я большой поклонник этого, но хотел что-то похожее на удобство сценариев).

5 ответов


Я не эксперт в go, но вы можете сделать что-то вроде этого. Я знаю, что это не элегантно, но может быть что-то начать с:)

~$ cat vikas.go
//usr/bin/env go run "" "$@"; 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-это компилируемый язык. Программы, написанные на языке Go, зависят от среды выполнения Go, которая добавляется в исполняемый двоичный файл.

среда выполнения Go предоставляет некоторые жизненно важные функции, такие как сбор мусора, планирование goroutine, отражение среды выполнения и т. д. Без них приложение Go не может работать так, как гарантируется спецификацией языка.

A теоретической 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 "" "$@"; 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.locals:

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, как показано выше, сделает для меня. No battling python 2 vs 3, его libs и pip horrors, имеют распространяемый двоичный файл по желанию и просто мгновенно могут изменить источник для небольших одноразовые сценарии-вот почему этот подход определенно имеет свои недостатки.


нет, это невозможно и нежелательно.