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
130
0
Share
初心者がGoでCLIツール作ってみて学んだこと
syossan27
June 20, 2022
More Decks by syossan27
See All by syossan27
プロポーザル サポートガイドを読み解いていこう!
syossan27
0
2
幻滅期を越える サイトリライアビリティ エンジニアリング
syossan27
1
200
一人SREが歩んだ Platform Engineering スモールスタート実践録
syossan27
2
1.5k
SREって何? 現場で学んだサイト信頼性の第一歩
syossan27
5
1.4k
知識0からカンファレンスやってみたらこうなった!
syossan27
5
650
突然のメモリ使用率上昇へ対応! k8sカスタムコントローラー開発事例
syossan27
2
530
監視 やばい
syossan27
12
11k
最先端を追う前に、まず広めよう! 〜AIツールの普及活動のすすめ〜
syossan27
2
1.6k
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
830
Other Decks in Programming
See All in Programming
Migration to Signals, Signal Forms, Resource API, and NgRx Signal Store @Angular Days 03/2026 Munich
manfredsteyer
PRO
0
240
アーキテクチャモダナイゼーションとは何か
nwiizo
17
4.4k
まかせられるPM・まかせられないPM / DevTech GUILD Meetup
yusukemukoyama
0
110
The Monolith Strikes Back: Why AI Agents ❤️ Rails Monoliths
serradura
0
240
Go_College_最終発表資料__外部公開用_.pdf
xe_pc23
0
130
PHPで TLSのプロトコルを実装してみるをもう一度しゃべりたい
higaki_program
0
180
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
410
Radical Imagining - LIFT 2025-2027 Policy Agenda
lift1998
0
250
Swift Concurrency Type System
inamiy
0
290
Don't Prompt Harder, Structure Better
kitasuke
0
380
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
130
Running Swift without an OS
kishikawakatsumi
0
330
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
200
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
Code Reviewing Like a Champion
maltzj
528
40k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Prompt Engineering for Job Search
mfonobong
0
250
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2k
Building Applications with DynamoDB
mza
96
7k
Are puppies a ranking factor?
jonoalderson
1
3.2k
Typedesign – Prime Four
hannesfritz
42
3k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
260
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の文化として短い変数名を使う • 対応 • 基本は短い変数名で、必要によって制限を外す
どんなものでもアウトプットしていけば 色々な発見があるので 皆アウトプットしていこう!₍₍⁽⁽(◌ી( ˘ω˘ )ʃ)₎₎⁾⁾