CUBE SUGAR CONTAINER

技術系のこと書きます。

Golang: gore でスニペットの動作を確認する

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

そんな感じでスニペットの動作をさくっと確認したいときはべんり。