⚙️ Go программа как shell скрипт


Маленькая заметка.

Программы на Go можно использовать как shell скрипты без предварительной компиляции или чего -то такого.

Достаточно в начале программы добавить строку //usr/bin/env go run $0 $@ ; exit, затем дать права на запуск (chmod +x script.go) и можно запускать (./script.go)

Пример:

//usr/bin/env go run $0 $@ ; exit
package main

import "fmt"

func main() {
	fmt.Println("Hello, world!")
}
➜  ~ chmod +x test.go
➜  ~ ./test.go
Hello, world!

UPD: по меткому замечанию товарища Игоря спешу объясниться, в чём вся соль.

Почему не шебанг? Потому что конструкция #! ... не является корректной с точки зрения Go, а два слеша являются обычным комментарием и по совместительству, корректным указанием корня пути. Такой костыль в итоге и даёт нам желаемый результат.

Будет ли оно конпелироваться каждый раз? И если да, то сколько времени занимает конпеляция? Да, будет. Так как go run по сути это шорткат для go build ИМЯ.go && ./ИМЯ. Уверен, что умный компилятор где-то кеширует промежуточные результаты, но это уже детали - компиляция таки будет.