2013-10-26 31 views
3

是否可以將代碼字符串傳入go run而不是go run /some/path/script.go?我試過了:將代碼直接傳遞到無需文件的運行

echo "some awesome go code here" | go run 

但是不行。謝謝。

+0

一行代碼:'echo「something>> x.go && go run x.go' –

+0

沒有電腦可以試用它,但我懷疑這會起作用嗎? 'echo「代碼代碼」|「去運行/ dev/stdin' – MatrixFrog

+0

去運行/ dev/stdin不起作用。 Go檢查文件名是'* .go'。所以我試過'ln -s/dev/stdin stdin.go'。但是,這發生了: http://pastebin.com/YF1rv1bG 我的假設是去嘗試尋求。如果輸入文件是標準輸入,它會中斷。 –

回答

1

因爲我認爲這將是一件有用的事情,我寫了一個相對較小的Python腳本,實現了我認爲你想要的。我把它叫做go-script,這裏有一些用法示例:

# Assuming that test.go is a valid go file including package and imports 
$ go-script --no-package < test.go 

# Runs code from stdin, importing 'fmt' and wrapping it in a func main(){} 
$ echo 'fmt.Println("test")' | go-script --import fmt --main 
$ echo 'fmt.Println("test")' | go-script -ifmt -m 

幫助:

Usage: go-script [options] 

Options: 
    -h, --help   show this help message and exit 
    -i PACKAGE, --import=PACKAGE 
         Import package of given name 
    -p, --no-package  Don't specify 'package main' (enabled by default) 
    -m, --main   Wrap input in a func main() {} block 
    -d, --debug   Print the generated Go code instead of running it. 

源(也可as a gist):

#!/usr/bin/env python 

from __future__ import print_function 
from optparse import OptionParser 
import os 
import sys 

parser = OptionParser() 

parser.add_option("-i", "--import", dest="imports", action="append", default=[], 
        help="Import package of given name", metavar="PACKAGE") 

parser.add_option("-p", "--no-package", dest="package", action="store_false", default=True, 
        help="Don't specify 'package main' (enabled by default)") 

parser.add_option("-m", "--main", dest="main", action="store_true", default=False, 
        help="Wrap input in a func main() {} block") 

parser.add_option("-d", "--debug", dest="debug", action="store_true", default=False, 
        help="Print the generated Go code instead of running it.") 

(options, args) = parser.parse_args() 

stdin = "" 
for line in sys.stdin.readlines(): 
    stdin += "%s\n" % line 

out = "" 
if options.package: 
    out += "package main\n\n" 

for package in options.imports: 
    out += "import \"%s\"\n" % package 

out += "\n" 
if options.main: 
    out += "func main() {\n%s\n}\n" % stdin 
else: 
    out += stdin 

if options.debug: 
    print(out) 
else: 
    tmpfile = "%s%s" % (os.environ["TMPDIR"], "script.go") 
    f = open(tmpfile, 'w') 
    print(out, file=f) 
    f.close() 
    os.execlp("go", "", "run", tmpfile) 
0

這工作

cat <<EOF | tee /tmp/blah.go | go run /tmp/blah.go 

package main 
import "fmt" 

func main() { 
    fmt.Println("Hello, World!") 
} 
EOF 

如果你不想打開一個文件並先編輯它。雖然我不會發現這種超級實用的每天使用。

+0

謝謝,但仍然是將源代碼寫入磁盤'/ tmp/blah.go'。無論如何不寫文件? – Justin