Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
初心者が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()で出力できるパッケージ
• BurntSush...
初心者ならではの
様々な失敗
• packageで分ける粒度が分からず、一つのファイルに全
てを突っ込む
• エラーハンドリング時に適当にpanicを使ったために自
分がpanic
• 構造体メソッドに対してポインタレシーバを使わない
• やた...
packageで分ける粒度が分からず、
一つのファイルに全てを突っ込む
• 何が問題だったか?
• 密結合がひどい
• 適切な分け方が分からなかった
• 対応
• 今回ではコマンド毎の処理をpackageに分けるべきだ
った
エラーハンドリング時に
適当にpanicを使ったために自分がpanic
• 何が問題だったか?
• panicはユーザーに対して出すべきではないメッセージ
を出してしまう
(想定ユーザーが開発者の場合は、適した場所で使う
べき)
• 対応
• ...
構造体メソッドに対して
ポインタレシーバを使わない
• 何が問題だったか?
• ポインタレシーバの代わりに値レシーバを使っていた
• 値レシーバだとポインタ変数がnilの場合に構造体メソッドを呼
び出すと、panicが呼び出される
• 値レシー...
やたら変数名を長くしちゃう
• 何が問題だったか?
• Goの文化として短い変数名を使う
• 対応
• 基本は短い変数名で、必要によって制限を外す
どんなものでもアウトプットしていけば
色々な発見があるので
皆アウトプットしていこう!₍₍⁽⁽(ી ( ˘ω˘ )ʃ)₎₎⁾⁾
Upcoming SlideShare
Loading in …5
×

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

3,657 views

Published on

「最近、Go言語始めました」の会の資料です

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

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

×