go generate 完全入門

Y
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!
1 of 13

Recommended

フロー効率性とリソース効率性について #xpjug by
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
106.4K views62 slides
こわくない Git by
こわくない Gitこわくない Git
こわくない GitKota Saito
881.6K views186 slides
開発速度が速い #とは(LayerX社内資料) by
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
61.7K views18 slides
Selenium WebDriver + python で E2Eテスト自動化 by
Selenium WebDriver + python で E2Eテスト自動化Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化JustSystems Corporation
7.4K views17 slides
5分で解るセキュアコーディング by
5分で解るセキュアコーディング5分で解るセキュアコーディング
5分で解るセキュアコーディングYasuo Ohgaki
16.7K views21 slides
Python 3.9からの新定番zoneinfoを使いこなそう by
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうRyuji Tsutsui
6.9K views42 slides

More Related Content

What's hot

やはりお前らのMVCは間違っている by
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
145.7K views66 slides
君はyarn.lockをコミットしているか? by
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
30.5K views25 slides
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
148.8K views45 slides
200人での対戦も可能!?Photon 新SDKについて by
200人での対戦も可能!?Photon 新SDKについて200人での対戦も可能!?Photon 新SDKについて
200人での対戦も可能!?Photon 新SDKについてPhoton運営事務局
727 views31 slides
マイクロにしすぎた結果がこれだよ! by
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
132.7K views32 slides
ビジネスパーソンのためのDX入門講座エッセンス版 by
ビジネスパーソンのためのDX入門講座エッセンス版ビジネスパーソンのためのDX入門講座エッセンス版
ビジネスパーソンのためのDX入門講座エッセンス版Tokoroten Nakayama
52.6K views26 slides

What's hot(20)

やはりお前らのMVCは間違っている by Koichi Tanaka
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka145.7K views
君はyarn.lockをコミットしているか? by Teppei Sato
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
Teppei Sato30.5K views
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 by Takuto Wada
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada148.8K views
200人での対戦も可能!?Photon 新SDKについて by Photon運営事務局
200人での対戦も可能!?Photon 新SDKについて200人での対戦も可能!?Photon 新SDKについて
200人での対戦も可能!?Photon 新SDKについて
マイクロにしすぎた結果がこれだよ! by mosa siru
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru132.7K views
ビジネスパーソンのためのDX入門講座エッセンス版 by Tokoroten Nakayama
ビジネスパーソンのためのDX入門講座エッセンス版ビジネスパーソンのためのDX入門講座エッセンス版
ビジネスパーソンのためのDX入門講座エッセンス版
Tokoroten Nakayama52.6K views
エンジニアの個人ブランディングと技術組織 by Takafumi ONAKA
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA23.4K views
マイクロサービス 4つの分割アプローチ by 増田 亨
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨41.4K views
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか? by naoki koyama
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
naoki koyama91.3K views
DockerコンテナでGitを使う by Kazuhiro Suga
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga18.8K views
Twitterのsnowflakeについて by moai kids
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids24.8K views
Cloud runのオートスケールを検証してみる by 虎の穴 開発室
Cloud runのオートスケールを検証してみるCloud runのオートスケールを検証してみる
Cloud runのオートスケールを検証してみる
テスト文字列に「うんこ」と入れるな by Kentaro Matsui
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui178.7K views
GraphQLのsubscriptionで出来ること by Shingo Fukui
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
Shingo Fukui9.1K views
心理的安全性の構造 デブサミ2019夏 structure of psychological safety by Tokoroten Nakayama
心理的安全性の構造 デブサミ2019夏 structure of psychological safety心理的安全性の構造 デブサミ2019夏 structure of psychological safety
心理的安全性の構造 デブサミ2019夏 structure of psychological safety
Tokoroten Nakayama189K views
Redisの特徴と活用方法について by Yuji Otani
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani101.6K views
最近のBurp Suiteについて調べてみた by zaki4649
最近のBurp Suiteについて調べてみた最近のBurp Suiteについて調べてみた
最近のBurp Suiteについて調べてみた
zaki464910.1K views
SolrとElasticsearchを比べてみよう by Shinsuke Sugaya
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya52.3K views
SPAのルーティングの話 by ushiboy
SPAのルーティングの話SPAのルーティングの話
SPAのルーティングの話
ushiboy22.5K views

Similar to go generate 完全入門

サーバーレスで作る スマホアプリバックエンド by
サーバーレスで作るスマホアプリバックエンドサーバーレスで作るスマホアプリバックエンド
サーバーレスで作る スマホアプリバックエンドTsukasa Kato
916 views30 slides
Mulvery@沖縄Ruby会議02 by
Mulvery@沖縄Ruby会議02Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Daichi Teruya
1.9K views70 slides
SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ... by
SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ...SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ...
SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ...SORACOM,INC
291 views162 slides
アカツキはどのようにAWSを活用しているか #jawsug by
アカツキはどのようにAWSを活用しているか #jawsugアカツキはどのようにAWSを活用しているか #jawsug
アカツキはどのようにAWSを活用しているか #jawsugaktsk
10.2K views28 slides
Xamarin 概要 2014年08月版 by
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Yoshito Tabuchi
3.7K views76 slides
日記アプリでCloud kitを使う by
日記アプリでCloud kitを使う日記アプリでCloud kitを使う
日記アプリでCloud kitを使う幸雄 村上
980 views21 slides

Similar to go generate 完全入門(20)

サーバーレスで作る スマホアプリバックエンド by Tsukasa Kato
サーバーレスで作るスマホアプリバックエンドサーバーレスで作るスマホアプリバックエンド
サーバーレスで作る スマホアプリバックエンド
Tsukasa Kato916 views
Mulvery@沖縄Ruby会議02 by Daichi Teruya
Mulvery@沖縄Ruby会議02Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02
Daichi Teruya1.9K views
SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ... by SORACOM,INC
SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ...SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ...
SORACOM UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ...
SORACOM,INC291 views
アカツキはどのようにAWSを活用しているか #jawsug by aktsk
アカツキはどのようにAWSを活用しているか #jawsugアカツキはどのようにAWSを活用しているか #jawsug
アカツキはどのようにAWSを活用しているか #jawsug
aktsk10.2K views
Xamarin 概要 2014年08月版 by Yoshito Tabuchi
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版
Yoshito Tabuchi3.7K views
日記アプリでCloud kitを使う by 幸雄 村上
日記アプリでCloud kitを使う日記アプリでCloud kitを使う
日記アプリでCloud kitを使う
幸雄 村上980 views
Mbed祭り 2017@春の新横浜 20170225 竹之下 by Koyo Takenoshita
Mbed祭り 2017@春の新横浜 20170225 竹之下Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下
Koyo Takenoshita944 views
OpenGLプログラミング by 幸雄 村上
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
幸雄 村上442 views
HTML5時代のwebクリエイターに必要なこと by Masakazu Muraoka
HTML5時代のwebクリエイターに必要なことHTML5時代のwebクリエイターに必要なこと
HTML5時代のwebクリエイターに必要なこと
Masakazu Muraoka1.2K views
Cloud kitを使った日記アプリで写真をどう扱うか by 幸雄 村上
Cloud kitを使った日記アプリで写真をどう扱うかCloud kitを使った日記アプリで写真をどう扱うか
Cloud kitを使った日記アプリで写真をどう扱うか
幸雄 村上1K views
福井スマートフォンハッカソン Titanium Mobileの紹介 by Mori Shingo
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
Mori Shingo1.3K views
Azureお助けサービス概要 by Keiji Kamebuchi
Azureお助けサービス概要Azureお助けサービス概要
Azureお助けサービス概要
Keiji Kamebuchi279 views
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~ by Saki Homma
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Saki Homma2.1K views
Building Static Website With Github And Jekyll by Yoji Shidara
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
Yoji Shidara1.8K views
Endo kitura on_bluemix by joohoun song
Endo kitura on_bluemixEndo kitura on_bluemix
Endo kitura on_bluemix
joohoun song758 views
使い倒そう Visual Studio Code! ~クラウド連携や遠隔ペアプロ、  もちろん Git も便利に~ by Saki Homma
使い倒そう Visual Studio Code!~クラウド連携や遠隔ペアプロ、 もちろん Git も便利に~使い倒そう Visual Studio Code!~クラウド連携や遠隔ペアプロ、 もちろん Git も便利に~
使い倒そう Visual Studio Code! ~クラウド連携や遠隔ペアプロ、  もちろん Git も便利に~
Saki Homma2.8K views
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~ by Saki Homma
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Saki Homma22.2K views
VSCodeで始めるAzure Static Web Apps開発 by Yuta Matsumura
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
Yuta Matsumura987 views

More from yaegashi

Terraforming Windows Virtual Desktop Infrastructure on Azure by
Terraforming Windows Virtual Desktop Infrastructure on AzureTerraforming Windows Virtual Desktop Infrastructure on Azure
Terraforming Windows Virtual Desktop Infrastructure on Azureyaegashi
127 views18 slides
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD by
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CDAzure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CDyaegashi
204 views57 slides
Customazed CLI: カスタムVMイメージ作成支援ツール by
Customazed CLI: カスタムVMイメージ作成支援ツールCustomazed CLI: カスタムVMイメージ作成支援ツール
Customazed CLI: カスタムVMイメージ作成支援ツールyaegashi
678 views16 slides
Goで作って配布するAzureコマンドラインユーティリティ by
Goで作って配布するAzureコマンドラインユーティリティGoで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティyaegashi
226 views16 slides
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築 by
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築yaegashi
156 views27 slides
msgraph: Terraform provider for Microsoft Graph by
msgraph: Terraform provider for Microsoft Graphmsgraph: Terraform provider for Microsoft Graph
msgraph: Terraform provider for Microsoft Graphyaegashi
71 views26 slides

More from yaegashi(14)

Terraforming Windows Virtual Desktop Infrastructure on Azure by yaegashi
Terraforming Windows Virtual Desktop Infrastructure on AzureTerraforming Windows Virtual Desktop Infrastructure on Azure
Terraforming Windows Virtual Desktop Infrastructure on Azure
yaegashi127 views
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD by yaegashi
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CDAzure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
yaegashi204 views
Customazed CLI: カスタムVMイメージ作成支援ツール by yaegashi
Customazed CLI: カスタムVMイメージ作成支援ツールCustomazed CLI: カスタムVMイメージ作成支援ツール
Customazed CLI: カスタムVMイメージ作成支援ツール
yaegashi678 views
Goで作って配布するAzureコマンドラインユーティリティ by yaegashi
Goで作って配布するAzureコマンドラインユーティリティGoで作って配布するAzureコマンドラインユーティリティ
Goで作って配布するAzureコマンドラインユーティリティ
yaegashi226 views
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築 by yaegashi
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
yaegashi156 views
msgraph: Terraform provider for Microsoft Graph by yaegashi
msgraph: Terraform provider for Microsoft Graphmsgraph: Terraform provider for Microsoft Graph
msgraph: Terraform provider for Microsoft Graph
yaegashi71 views
msgraph.go: Go言語で Microsoft Graph プログラミング by yaegashi
msgraph.go: Go言語で Microsoft Graph プログラミングmsgraph.go: Go言語で Microsoft Graph プログラミング
msgraph.go: Go言語で Microsoft Graph プログラミング
yaegashi1.1K views
AnsibleでAzureの インフラを管理する話 + α by yaegashi
AnsibleでAzureの インフラを管理する話 + αAnsibleでAzureの インフラを管理する話 + α
AnsibleでAzureの インフラを管理する話 + α
yaegashi477 views
msgraph-sshpubkey by yaegashi
msgraph-sshpubkeymsgraph-sshpubkey
msgraph-sshpubkey
yaegashi205 views
Microsoft Graph API Library for Go by yaegashi
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
yaegashi4.5K views
Raspberry Pi + Go で IoT した話 by yaegashi
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
yaegashi3.1K views
golang binary hacks by yaegashi
golang binary hacksgolang binary hacks
golang binary hacks
yaegashi2.8K views
StackExchangeで見たシステムプログラミング案件 by yaegashi
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
yaegashi434 views
Ansible モジュール 作成・配布・貢献 by yaegashi
Ansible モジュール 作成・配布・貢献Ansible モジュール 作成・配布・貢献
Ansible モジュール 作成・配布・貢献
yaegashi2.1K views

Recently uploaded

PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PC Cluster Consortium
36 views36 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
136 views26 slides
私のMicrosoft Azure 2023 by
私のMicrosoft Azure 2023私のMicrosoft Azure 2023
私のMicrosoft Azure 2023Ryuji Iwata
5 views36 slides
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PC Cluster Consortium
71 views12 slides
光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
31 views17 slides
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 by
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可Hitachi, Ltd. OSS Solution Center.
18 views22 slides

Recently uploaded(6)

PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
私のMicrosoft Azure 2023 by Ryuji Iwata
私のMicrosoft Azure 2023私のMicrosoft Azure 2023
私のMicrosoft Azure 2023
Ryuji Iwata5 views
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga31 views

go generate 完全入門

  • 1. go generate 完全入門 2020-06-03 プログラミング言語Go完全入門 質問会 Takeshi Yaegashi
  • 2. 自己紹介 八重樫 剛史 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」
  • 3. 今日の話題 go generate 完全入門 Go コード生成概論(?) ● そもそも 5 分間の LT で完全入門できる ような話題ではない ● プログラミング言語 Go 完全入門 に go generate がなかったので、出来 心であやかったタイトルをつけてしまっ た… 新章のアナウンス!期待しています!
  • 4. Go のコード生成とコードジェネレータ ● コード生成 ○ Go のプログラムをプログラムで自動生成すること ● コードジェネレータ ○ Go のプログラムを生成するプログラム ● コードジェネレータを作る ○ いわゆるメタプログラミング = プログラムを作るプログラムを作る ○ Go には様々なコード生成を支援する機能がある ● コードジェネレータを使う ○ Go のエコシステムでは様々なコードジェネレータが公開されている
  • 5. どういうときにコード生成するのか ● テーブルやアセットの埋め込み ○ 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 … コード生成のテンプレートの記述が楽になるツール
  • 6. なぜコード生成するのか ● コーディングに必要な筋力の削減、つまらないミスの防止 ○ 似たようなコードを繰り返し人間が書くのは最小限にしたい ● 動的なデータや型、リフレクションを避ける ○ 静的なコードを徹底することで得られるメリット ■ 実行時のパフォーマンスの最適化 ■ 開発時のコーディング支援の最大化
  • 7. コード生成を支援する Go の機能 ● //go:generate ディレクティブ ○ ソースコード中にコードジェネレータを実行するコマンドラインが書ける ○ $GOPACKAGE や $GOFILE といった環境変数がコードジェネレータに渡される ● コードフォーマッタ (gofmt, goimports, etc.) ○ コード整形の標準ツール、ライブラリとしても呼び出し可能 ○ コードジェネレータはインデントやインポートなどを気しなくてもよくなるので開発が楽 ● テンプレート (text/template) ○ 充実した機能を持つテンプレートエンジンが標準ライブラリで利用可能 ● ビルドタグ ○ // +build ignore でコードジェネレータのソースコードをビルドから除外する
  • 8. コード生成したくなる Go の機能 ● ソースコードの静的解析 ○ 解析が容易な Go の文法、標準ライブラリ (ast) によるサポート ○ コードジェネレータは自分を呼び出したソースコードの解析が容易にできる ○ 汎用ツール向け ● 実行時のリフレクション ○ コードジェネレータに対象のコードを取り込み reflect で調べる ○ 特定プロジェクト専用のコード生成で静的解析が面倒くさいときに使う代替手段 ○ struct のフィールドやタグの情報は取れるが、コメントに書いた情報などは取れない
  • 9. 実例: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
  • 10. 実例: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 コマンド
  • 11. 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
  • 12. go generate のベストプラクティス ● Go Modules など、最近の Go に導入さ れた機能を踏まえたコード生成のベスト プラクティスをまとめました ● このスライドで紹介した実例についての 追加のトピックもあります ● 今後も内容は随時更新 本日も更新しました! https://qiita.com/yaegashi/items/d1fd9f7d0c75b2bb7446
  • 13. おわり Happy Go code generating!