初心者がGoで
CLIツール作ってみて
学んだこと
しょっさん(@syossan27)
自己紹介
• しょっさん(@syossan27)
• Go/Ruby/PHP
• GoでCLIツール作ったり(kirimori, torisetsu)
最近あったこと
mattnさんから
PRを頂いた₍₍⁽⁽(ી ( ˘ω˘ )ʃ)₎₎⁾⁾
!!
これまで作ったもの
• kirimori:
vimのプラグインをCLIから追加や削除等出来るツール
• torisetsu:
GithubでよくみるREADME.mdのテンプレートを作成し
、ファイルとして出力するツール
kirimori
• 使用パッケージ
• urfave/cli:
CLIツール作成パッケージ
• mitchellh/go-homedir:
ユーザーのホームディレクトリがhomedir.Dir()で出力できるパッケージ
• BurntSushi/toml:
TOMLのparserパッケージ
設定ファイルをTOML形式にしたので使用
• haya14busa/go-vimlparser:
vimLのparserパッケージ
.vimrcの中身を扱うために使用
• Songmu/prompter:
対話形式を簡単に実装できるパッケージ
初心者ならではの
様々な失敗
• packageで分ける粒度が分からず、一つのファイルに全
てを突っ込む
• エラーハンドリング時に適当にpanicを使ったために自
分がpanic
• 構造体メソッドに対してポインタレシーバを使わない
• やたら変数名を長くしちゃう
packageで分ける粒度が分からず、
一つのファイルに全てを突っ込む
• 何が問題だったか?
• 密結合がひどい
• 適切な分け方が分からなかった
• 対応
• 今回ではコマンド毎の処理をpackageに分けるべきだ
った
エラーハンドリング時に
適当にpanicを使ったために自分がpanic
• 何が問題だったか?
• panicはユーザーに対して出すべきではないメッセージ
を出してしまう
(想定ユーザーが開発者の場合は、適した場所で使う
べき)
• 対応
• panicではなく、fmt.Fprintf(stderr,”hoge”)など出力して
からos.Exitするべきだった
構造体メソッドに対して
ポインタレシーバを使わない
• 何が問題だったか?
• ポインタレシーバの代わりに値レシーバを使っていた
• 値レシーバだとポインタ変数がnilの場合に構造体メソッドを呼
び出すと、panicが呼び出される
• 値レシーバだと構造体メソッドが構造体のフィールドの値を更
新できない
• 対応
• 値レシーバからポインタレシーバに変更した
やたら変数名を長くしちゃう
• 何が問題だったか?
• Goの文化として短い変数名を使う
• 対応
• 基本は短い変数名で、必要によって制限を外す
どんなものでもアウトプットしていけば
色々な発見があるので
皆アウトプットしていこう!₍₍⁽⁽(ી ( ˘ω˘ )ʃ)₎₎⁾⁾

初心者がGoでcliツール作ってみて学んだこと