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
180
Microsoft Entra/Azure による Redmine の企業内利用向けカスタマイズと運用
yaegashi
0
660
バンダイナムコスタジオにおけるクラウドネイティブなゲーム開発スタジオの挑戦
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
590
rclonefunction
yaegashi
0
950
大規模ゲーム開発を支えるAzure DevOpsによるクラウドネイティブなCI/CDの紹介
yaegashi
5
2.9k
Other Decks in Technology
See All in Technology
바이브풀 라이프
arawn
0
100
つくって納得、つかって実感! 大規模言語モデルことはじめ ver2.0
recruitengineers
PRO
3
1.1k
SmartHR Engineering Team Deck
smarthr
0
790
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
サイバー捜査員研修(前半)
nomizone
1
1.9k
TypeScript入門 2026
recruitengineers
PRO
2
490
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
6
1k
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
11
8.3k
Data Hubグループ 紹介資料
sansan33
PRO
0
3.1k
【CEDEC2026】『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
1
200
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
780
モノリス Rails でも日中に rails db:migrate を走らせたい! / Daytime rails db:migrate on Monolithic Rails!
euglena1215
4
550
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
450
Design in an AI World
tapps
1
270
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
A Tale of Four Properties
chriscoyier
163
24k
Into the Great Unknown - MozCon
thekraken
41
2.7k
We Have a Design System, Now What?
morganepeng
55
8.3k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
160
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
360
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
Deep Space Network (abreviated)
tonyrice
0
250
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!