Golang でも REPL を使いたいときは gore というサードパーティ製のパッケージがある。
今回使った環境は次の通り。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.11.4 BuildVersion: 15E65 $ go version go version go1.6 darwin/amd64
インストール
インストールは go get でさくさくと。
$ go get -u github.com/motemen/gore
インストールが終わると gore コマンドで REPL が立ち上がる。
$ gore gore version 0.2.5 :help for help gore>
使ってみる
あとは Python の REPL なんかと同じように一行ずつコードを入力していく。
gore> msg := "Hello, World!" "Hello, World!"
注意点としてはパッケージをインポートするときは先頭にコロン (:) をつける必要があるところかな。
gore> :import fmt
それ以外だと fmt のプリント系関数を使うときも動作にクセがある。 ひとまず一旦 fmt.Println() してみよう。
gore> fmt.Println(msg) Hello, World! 14 <nil>
そして、次はおもむろに変数に代入でもしてみる。
gore> n := 1 Hello, World! 1
なんかさっきと同じメッセージがまた表示されてる?!
実は、この動作は gore の内部実装と関係がある。 gore は内部的には入力された内容をひとつのファイルにマージした上で実行する作りになっているらしい。
例えば :print を入力すると、現在のソースコードの全体像が確認できる。
gore> :print package main import "fmt" func __gore_p(xx ...interface{}) { for _, x := range xx { fmt.Printf("%#v\n", x) } } func main() { msg := "Hello, World!"; fmt.Println(msg); n := 1 }
ソースコード的には fmt.Println() したあとで変数 n に代入ことになっている。 そりゃ毎回メッセージが出るわけだね。
REPL で godoc を読む
godoc をインストールしておくと gore の REPL でドキュメントが読める。
$ go get -u golang.org/x/tools/cmd/godoc
:doc を入力してパッケージを指定すると、そのパッケージのドキュメントが表示される。
gore> :doc fmt
そんな感じでスニペットの動作をさくっと確認したいときはべんり。