Edited at

The Go Playground上で簡単に複数のファイルをシェアする #golang


The Go Playgroundが複数ファイル対応になった

Goコミュニティでみんなが便利に使っているThe Go Playgroundですが、ついに複数ファイルに対応しました。

参考:https://github.com/golang/go/issues/32040

txtarという複数のファイルを1つのファイルにまとめる方法を使うことによって複数のファイルを記述しています。

例えば、次のようなディレクトリ構成のGoのプロジェクトがあったとします。

.

├── fuga
│   └── fuga.go
├── go.mod
└── main.go

これをtxtar形式で1つのファイルにまとめると次のようになります。

-- go.mod --

module hogera

go 1.12
-- fuga/fuga.go --
package fuga

func Fuga() string {
return "Fuga"
}
-- main.go --
package main

import (
"fmt"
"hogera/fuga"
)

func main() {
fmt.Println(fuga.Fuga())
}

txtar形式はファイルを-- ファイルパス --で区切って表現します。

シンプルな形式なので簡単に書くことができますが、ファイル中に--で始まる行があるとうまくいかないので注意が必要です。

https://play.golang.org/p/4CGQN8slkSl

package main

import (
"fmt"
)

/*
-- hogera --
*/

func main() {
fmt.Println("Hello, playground")
}

手で入力していくのはなかなか大変なため、Chromeの拡張機能を使うとファイルごとにタブで記述できるようになるため便利です。


コマンドラインから複数のファイルをまとめてシェアする

コマンドラインから手元のソースコードをサクッとシェアできると便利です。

筆者が開発しているThe Go Playgroundをコマンドラインから操作するツールであるgpを使うと簡単に複数のファイルをtxar形式でシェアすること可能になります。

gpのインストールはgo getで行うことができます。

$ go get https://github.com/tenntenn/goplayground/cmd/gp

複数のファイルをまとめてシェアするには、次のようにshareサブコマンドを用います。

$ gp share a.go b.go

複数のファイルをまとめるには、次のようにfindコマンドなどで用いると良いでしょう。

なお、ここでは不可視ファイルを無視するように-path '*/\.*'を指定しています。

find . -not -path '*/\.*' -type f | xargs gp share


The Go Playgroundからソースコードをダウンロードする

gpコマンドを用いるとThe Go Playground上でシェアされたコードをダウンロードすることもできます。

次のように何も指定しない場合には標準出力に出力されます。

$ gp download https://play.golang.org/p/sTkdodLtokQ

package main

import (
"fmt"
)

func main() {
fmt.Println("Hello, playground")
}

txtar形式の場合でも何も指定しなければそのまま標準出力に出力されますが、-dldirオプションでディレクトリを指定するとディレクトリ以下にtxttar形式を展開した形でファイルやディレクトリを保存してくれます。

$ gp download -dldir=output https://play.golang.org/p/Ccn7TxELuAT

$ tree output
output
├── fuga
│   └── fuga.go
├── go.mod
└── main.go


まとめ

gp便利なのでぜひ使ってみてください。