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
知識0からカンファレンスやってみたらこうなった!
syossan27
5
350
突然のメモリ使用率上昇へ対応! k8sカスタムコントローラー開発事例
syossan27
2
410
監視 やばい
syossan27
12
11k
最先端を追う前に、まず広めよう! 〜AIツールの普及活動のすすめ〜
syossan27
1
1.4k
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
660
SRE Trail Mapから考える仲間の増やし方
syossan27
3
700
FanstaにおけるCI・CDの紹介と培った知見
syossan27
2
400
TerraformサポートされていないFirebase Remote ConfigでもIaCしてみた
syossan27
2
1.5k
実録!一人SREが直面している技術的負債
syossan27
8
3.8k
Other Decks in Programming
See All in Programming
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
5
1.1k
AIと”コードの評価関数”を共有する / Share the "code evaluation function" with AI
euglena1215
1
170
明示と暗黙 ー PHPとGoの インターフェイスの違いを知る
shimabox
2
520
Modern Angular with Signals and Signal Store:New Rules for Your Architecture @enterJS Advanced Angular Day 2025
manfredsteyer
PRO
0
220
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
830
プロダクト志向ってなんなんだろうね
righttouch
PRO
0
190
ペアプロ × 生成AI 現場での実践と課題について / generative-ai-in-pair-programming
codmoninc
2
18k
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
730
GPUを計算資源として使おう!
primenumber
1
120
Agentic Coding: The Future of Software Development with Agents
mitsuhiko
0
110
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
780
PipeCDのプラグイン化で目指すところ
warashi
1
280
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
970
Six Lessons from altMBA
skipperchong
28
3.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
Into the Great Unknown - MozCon
thekraken
40
1.9k
For a Future-Friendly Web
brad_frost
179
9.8k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
Building Adaptive Systems
keathley
43
2.7k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
GitHub's CSS Performance
jonrohan
1031
460k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Docker and Python
trallard
44
3.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の文化として短い変数名を使う • 対応 • 基本は短い変数名で、必要によって制限を外す
どんなものでもアウトプットしていけば 色々な発見があるので 皆アウトプットしていこう!₍₍⁽⁽(◌ી( ˘ω˘ )ʃ)₎₎⁾⁾