手元に The Go Playground 的な環境を用意しておく
The Go Playground https://play.golang.org/ は便利ですが、IDE の補完に頼り切りのわたしにとっては逆に挙動の確認に時間がかかる手段となっています。
そこで fsnotify で保存ごとに実行してくれる main.go
を用意してシュッと確認できる環境を用意しています。これを走らせた上で同 directory 上にファイルを配置すると勝手に走らせてくれるという寸法です。
main.go
package main
import (
"log"
"github.com/howeyc/fsnotify"
"strings"
"os/exec"
"fmt"
"bytes"
)
func main() {
watcher, err := fsnotify.NewWatcher()
done := make(chan bool)
go func() {
for {
select {
case ev := <-watcher.Event:
// through jetbrains temporary files
if strings.Contains(ev.Name, "___") {
break
}
// through myselfoddog69
if strings.Contains(ev.Name, "main.go") {
break
}
if ev.IsModify() {
log.Printf("Run: %v", ev.Name)
cmd := exec.Command("go", "run", ev.Name)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
log.Println(fmt.Sprint(err) + ": " + stderr.String())
break
}
log.Print(stderr.String())
log.Print(out.String())
}
case err := <-watcher.Error:
log.Println("error:", err)
}
}
}()
err = watcher.Watch(".")
if err != nil {
log.Fatal(err)
}
// Hang so program doesn't exit
<-done
watcher.Close()
}