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 generate 完全入門
Search
YAEGASHI Takeshi
June 03, 2020
Technology
13k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
go generate 完全入門
プログラミング言語Go完全入門 質問会
https://mercari.connpass.com/event/174255/
YAEGASHI Takeshi
June 03, 2020
More Decks by YAEGASHI Takeshi
See All by YAEGASHI Takeshi
Microsoft Entra IDとAzure App Serviceによる エンタープライズWebアプリ・サービスのプラットフォーム構築
yaegashi
0
190
Microsoft Entra/Azure による Redmine の企業内利用向けカスタマイズと運用
yaegashi
0
670
バンダイナムコスタジオにおけるクラウドネイティブなゲーム開発スタジオの挑戦
yaegashi
2
1.7k
Bandai Namco DX Cloud Studios の全貌
yaegashi
0
300
DX(開発者体験)の向上を目指す ゲーム開発インフラの進化とDX(デジタル変革)
yaegashi
0
220
Azure AD対応の認証プロキシサーバをGoで作っている話
yaegashi
0
300
ゲーム開発におけるクラウドネイティブな CI/CD の最新動向
yaegashi
0
600
rclonefunction
yaegashi
0
950
大規模ゲーム開発を支えるAzure DevOpsによるクラウドネイティブなCI/CDの紹介
yaegashi
5
2.9k
Other Decks in Technology
See All in Technology
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
330
internal/testlog で遊ぼう
rokuosan
0
270
わたしが知り合いゼロの勉強会に 行けるようになるまで
r5ni4
2
820
Claude Teamプランの コスト最適化を考える
rfdnxbro
0
770
どんな手を使っても絶対間に合わせるスケジューラ
asari194617
0
1.5k
エージェント化するAI:現在地とその先に起きる変化 / AI as Agents: The Current State and the Changes Ahead
ks91
PRO
0
140
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
1
540
形式手法特論:Hyperproperty とモデル検査 #kernelvm / Kernel VM Study Tokyo 19th
ytaka23
0
860
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3.2k
Windows の互換機能 - 古いプログラムはなぜ動作できるのか
murachiakira
PRO
0
120
Oracle AI Databaseデータベース・サービス: BaseDB/ExaDB-Dの可用性
oracle4engineer
PRO
1
930
dbt と Snowflake と tag
kevinrobot34
2
280
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
24k
How to Ace a Technical Interview
jacobian
281
24k
Accessibility Awareness
sabderemane
1
180
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
530
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Ethics towards AI in product and experience design
skipperchong
2
350
Design in an AI World
tapps
1
290
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
go generate 完全入門 2020-06-03 プログラミング言語Go完全入門 質問会 Takeshi Yaegashi
自己紹介 八重樫 剛史 Takeshi Yaegashi • 株式会社バンダイナムコスタジオ所属 • Linux・Unix・OSS・低レベルなことが好きなエンジニア •
ブログ https://l0w.dev Qiita https://qiita.com/yaegashi • 最近の仕事 ◦ Raspberry Pi IoT 案件 (Go) スマホゲームアプリのサーバ開発 (Go) ◦ 社内向け研究・開発インフラ構築 • 過去の登壇 ◦ Go Conference 2019 Autumn「Microsoft Graph API Library for Go」
今日の話題 go generate 完全入門 Go コード生成概論(?) • そもそも 5 分間の
LT で完全入門できる ような話題ではない • プログラミング言語 Go 完全入門 に go generate がなかったので、出来 心であやかったタイトルをつけてしまっ た… 新章のアナウンス!期待しています!
Go のコード生成とコードジェネレータ • コード生成 ◦ Go のプログラムをプログラムで自動生成すること • コードジェネレータ ◦
Go のプログラムを生成するプログラム • コードジェネレータを作る ◦ いわゆるメタプログラミング = プログラムを作るプログラムを作る ◦ Go には様々なコード生成を支援する機能がある • コードジェネレータを使う ◦ Go のエコシステムでは様々なコードジェネレータが公開されている
どういうときにコード生成するのか • テーブルやアセットの埋め込み ◦ go-bindata, go-assets, statik … ファイルの内容を文字列リテラルに変換するツール •
仕様書を元にしたコードの自動生成 ◦ time, wtz.go … Windows タイムゾーン対応表の XML から map リテラルを生成している ◦ msgraph.go … OData 仕様書の XML から API のコードを生成している ◦ go-swagger … Open API 仕様書の YAML から API のコードを生成するツール • コードを元にしたコードの自動生成 ◦ stringer … コードを静的解析して const 定義から文字列を生成するツール ◦ wire … コードを静的解析して DI のコードを生成するツール • ジェネリクスやマクロの代替手段 ◦ genny … コード生成のテンプレートの記述が楽になるツール
なぜコード生成するのか • コーディングに必要な筋力の削減、つまらないミスの防止 ◦ 似たようなコードを繰り返し人間が書くのは最小限にしたい • 動的なデータや型、リフレクションを避ける ◦ 静的なコードを徹底することで得られるメリット ▪
実行時のパフォーマンスの最適化 ▪ 開発時のコーディング支援の最大化
コード生成を支援する Go の機能 • //go:generate ディレクティブ ◦ ソースコード中にコードジェネレータを実行するコマンドラインが書ける ◦ $GOPACKAGE
や $GOFILE といった環境変数がコードジェネレータに渡される • コードフォーマッタ (gofmt, goimports, etc.) ◦ コード整形の標準ツール、ライブラリとしても呼び出し可能 ◦ コードジェネレータはインデントやインポートなどを気しなくてもよくなるので開発が楽 • テンプレート (text/template) ◦ 充実した機能を持つテンプレートエンジンが標準ライブラリで利用可能 • ビルドタグ ◦ // +build ignore でコードジェネレータのソースコードをビルドから除外する
コード生成したくなる Go の機能 • ソースコードの静的解析 ◦ 解析が容易な Go の文法、標準ライブラリ (ast)
によるサポート ◦ コードジェネレータは自分を呼び出したソースコードの解析が容易にできる ◦ 汎用ツール向け • 実行時のリフレクション ◦ コードジェネレータに対象のコードを取り込み reflect で調べる ◦ 特定プロジェクト専用のコード生成で静的解析が面倒くさいときに使う代替手段 ◦ struct のフィールドやタグの情報は取れるが、コメントに書いた情報などは取れない
実例:time (Windows タイムゾーン変換 map 生成) var abbrs = map[string]abbr{ "Egypt
Standard Time": {"EET", "EET"}, // Africa/Cairo "Morocco Standard Time": {"+00", "+01"}, // Africa/Casablanca "South Africa Standard Time": {"SAST", "SAST"}, // Africa/Johannesburg "Sudan Standard Time": {"CAT", "CAT"}, // Africa/Khartoum ... <supplementalData> <version number="$Revision$"/> <windowsZones> <mapTimezones otherVersion="7e11200" typeVersion="2019b"> ... <!-- (UTC+02:00) Cairo --> <mapZone other="Egypt Standard Time" territory="001" type="Africa/Cairo"/> <mapZone other="Egypt Standard Time" territory="EG" type="Africa/Cairo"/> ... Windowsタイムゾーン仕様 windowsZones.xml 生成された map リテラル zoneinfo_abbrs_windows.go //go:generate env ZONEINFO=$GOROOT/lib/time/zoneinfo.zip go run genzabbrs.go -output zoneinfo_abbrs_windows.go //go:generate を含む zoneinfo.go
実例:stringer (const の型に String() メソッド生成) const _Pill_name = "PlaceboAspirinIbuprofenParacetamol" var
_Pill_index = [...]uint8{0, 7, 14, 23, 34} func (i Pill) String() string { if i < 0 || i >= Pill(len(_Pill_index)-1) { return "Pill(" + strconv.FormatInt(int64(i), 10) + ")" } return _Pill_name[_Pill_index[i]:_Pill_index[i+1]] } type Pill int const ( Placebo Pill = iota Aspirin Ibuprofen Paracetamol Acetaminophen = Paracetamol ) //go:generate go run golang.org/x/tools/cmd/stringer -type=Pill Pill の String() メソッドが 生成された pill_string.go Pill 型の const 定義と //go:generate を含む pill.go go run で呼び出す stringer コマンド
Go のコード生成を深く知るための資料 • 自由度が高いゆえにわかりにくい・まちがいやすい • go generate のマニュアルを読む ◦ https://golang.org/cmd/go/#hdr-Generate_Go_files_by_processing_source
◦ go help generate で読める • go generate 登場時の記事を読む (Go 1.4 の頃; 2014 年末) ◦ The Go Blog: Generating code https://blog.golang.org/generate ▪ stringer を例として詳しく説明している ◦ Go ganerate: A proposal https://golang.org/s/go1.4-generate
go generate のベストプラクティス • Go Modules など、最近の Go に導入さ れた機能を踏まえたコード生成のベスト
プラクティスをまとめました • このスライドで紹介した実例についての 追加のトピックもあります • 今後も内容は随時更新 本日も更新しました! https://qiita.com/yaegashi/items/d1fd9f7d0c75b2bb7446
おわり Happy Go code generating!