手元に The Go Playground 的な環境を用意しておく

手元に 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()
}