Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
初心者がGoでCLIツール作ってみて学んだこと
Search
syossan27
June 20, 2022
Programming
0
120
初心者がGoでCLIツール作ってみて学んだこと
syossan27
June 20, 2022
Tweet
Share
More Decks by syossan27
See All by syossan27
一人SREが歩んだ Platform Engineering スモールスタート実践録
syossan27
1
940
SREって何? 現場で学んだサイト信頼性の第一歩
syossan27
4
1k
知識0からカンファレンスやってみたらこうなった!
syossan27
5
400
突然のメモリ使用率上昇へ対応! k8sカスタムコントローラー開発事例
syossan27
2
460
監視 やばい
syossan27
12
11k
最先端を追う前に、まず広めよう! 〜AIツールの普及活動のすすめ〜
syossan27
2
1.5k
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
720
SRE Trail Mapから考える仲間の増やし方
syossan27
3
750
FanstaにおけるCI・CDの紹介と培った知見
syossan27
2
430
Other Decks in Programming
See All in Programming
Flutterで分数(Fraction)を表示する方法
koukimiura
0
130
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心
ryotaros
7
1.1k
『毎日の移動』を支えるGoバックエンド内製開発
yutautsugi
2
240
uniqueパッケージの内部実装を支えるweak pointerの話
magavel
0
990
理論と実務のギャップを超える
eycjur
0
130
Devvox Belgium - Agentic AI Patterns
kdubois
1
120
高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025
naofumi
4
4k
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
2
480
CSC305 Lecture 05
javiergs
PRO
0
210
「ちょっと古いから」って避けてた技術書、今だからこそ読もう
mottyzzz
10
6.6k
止められない医療アプリ、そっと Swift 6 へ
medley
1
170
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
200
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
For a Future-Friendly Web
brad_frost
180
9.9k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
GraphQLとの向き合い方2022年版
quramy
49
14k
How to train your dragon (web standard)
notwaldorf
96
6.3k
Producing Creativity
orderedlist
PRO
347
40k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
19
1.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Raft: Consensus for Rubyists
vanstee
139
7.1k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Transcript
初心者が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の文化として短い変数名を使う • 対応 • 基本は短い変数名で、必要によって制限を外す
どんなものでもアウトプットしていけば 色々な発見があるので 皆アウトプットしていこう!₍₍⁽⁽(◌ી( ˘ω˘ )ʃ)₎₎⁾⁾