What's the appropriate Go shebang line?
Solution 1:
//usr/bin/go run $0 $@ ; exit
example:
//usr/bin/go run $0 $@ ; exit
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
go treat //
as a single line comment
and shell ignore extra /
Update: Go installation may be in a different location. The syntax below will take that into account, and works for Macs:
//$GOROOT/bin/go run $0 $@ ; exit
Solution 2:
I prefer this:
///usr/bin/true; exec /usr/bin/env go run "$0" "$@"
This has several advantages compared to the answer by هومن جاویدپور:
-
The
///usr/bin/true
accomplishes the feat of simultaneously being valid Go and shell syntax. In Go it is a comment. In shell, it is no-op command. -
Uses
exec
to replace the new shell process instead of launching a grandchild process. As a result, your Go program will be a direct child process. This is more efficient and it's also important for some advanced situations, such as debugging and monitoring. -
Proper quoting of arguments. Spaces and special characters won't cause problems.
-
The leading
///
is more standards compliant than just//
. If you only use//
, you run the risk of bumping into implementation-defined behaviour. Here's a quote from http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html:
If a pathname begins with two successive
/
characters, the first component following the leading/
characters may be interpreted in an implementation-defined manner, although more than two leading/
characters shall be treated as a single/
character.
I have tested this answer with bash, dash, zsh, and ksh.
Example:
///usr/bin/true; exec /usr/bin/env go run "$0" "$@"
package main
import "fmt"
func main() {
fmt.Println("你好!")
}
Solution 3:
There isn't one by default. There is a third-party tool called gorun that will allow you to do it, though. https://wiki.ubuntu.com/gorun
Unfortunately the compilers don't like the shebang line. You can't compile the same code you run with gorun.
Solution 4:
Go programs are compiled to binaries; I don't think there is an option to run them directly from source.
This is similar to other compiled languages such as C++ or Java. Some languages (such as Haskell) offer both a fully compiled mode and a "script" mode which you can run directly from source with a shebang line.