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
83
初心者がGoでCLIツール作ってみて学んだこと
syossan27
June 20, 2022
Tweet
Share
More Decks by syossan27
See All by syossan27
実録!一人SREが直面している技術的負債
syossan27
7
2.7k
SREに活かすセルフ・アウェアネス
syossan27
4
910
QAと共に築く、機能性を通じた信頼性担保への取り組み
syossan27
6
4.8k
サイト信頼性を高める前に開発チームからの信頼性を高めよう
syossan27
9
2.7k
OSS builder
syossan27
0
79
雑兵エンジニアから学ぶ転職の失敗・成功
syossan27
0
130
雑兵なのに副業をやってみた
syossan27
0
110
Laravelで自家製ライブラリを作ってみよう!
syossan27
0
93
技術的に流行を追い求めるのは間違っているだろうか?
syossan27
1
86
Other Decks in Programming
See All in Programming
AppDeveloperCon 2024 EU: Building polyglot developer experiences in 2024
salaboy
0
380
「コンパイル時のユニットテスト」導入するとユニットテストを 書かなくてよくなるのか?
tomohisa
9
2.2k
Deep Dive 大規模システムアーキテクチャ/開発組織エンジニアリング / Deep Dive Large-Scale System Architecture, Development Organization Engineering
nrslib
15
2.9k
生成 AI の中身を覗いてみよう〜基礎から医療現場での応用まで〜
soh9834
2
770
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
530
オブジェクト指向コードレビューの新しいアプローチ
akkie76
3
1.6k
チームでモデリングを育てるうえで 考えたこと・気づいたこと / Cultivating Modeling in Teams: Thoughts and Insights
mackey0225
5
2.5k
Open Source Swift Workshop - Foundation and first party libraries
ikesyo
0
270
Why 1 + 1 = 2 in Swift?
1plus4
1
250
C# 大統一理論推進委員会 会員のための Unity Package Manager プロジェクト構成案
monry
PRO
0
580
RubyVM を PHP で実装する 〜Hello World を出力するまで〜
memory1994
PRO
1
490
MySQL のインデックスの種類をおさらいしよう! / overviewing indexes in MySQL
okashoi
0
180
Featured
See All Featured
Pencils Down: Stop Designing & Start Developing
hursman
115
11k
jQuery: Nuts, Bolts and Bling
dougneiner
57
7.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
15
6.3k
Debugging Ruby Performance
tmm1
68
11k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.8k
StorybookのUI Testing Handbookを読んだ
zakiyama
10
4.5k
Learning to Love Humans: Emotional Interface Design
aarron
266
39k
Automating Front-end Workflow
addyosmani
1353
200k
A designer walks into a library…
pauljervisheath
199
23k
Fireside Chat
paigeccino
19
2.6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
240
1.2M
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
153
14k
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の文化として短い変数名を使う • 対応 • 基本は短い変数名で、必要によって制限を外す
どんなものでもアウトプットしていけば 色々な発見があるので 皆アウトプットしていこう!₍₍⁽⁽(◌ી( ˘ω˘ )ʃ)₎₎⁾⁾