SlideShare una empresa de Scribd logo
1 de 13
Descargar para leer sin conexión
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!

Más contenido relacionado

La actualidad más candente

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-
Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-
Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-Shinichiro Yoshida
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 Yugo Shimizu
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 

La actualidad más candente (20)

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-
Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-
Laravel×DevOps -インフラ構築の自動化から運用ログの監視まで-
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出GitLab から GitLab に移行したときの思い出
GitLab から GitLab に移行したときの思い出
 

Similar a go generate 完全入門

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

Similar a go generate 完全入門 (20)

サーバーレスで作る スマホアプリバックエンド
サーバーレスで作るスマホアプリバックエンドサーバーレスで作るスマホアプリバックエンド
サーバーレスで作る スマホアプリバックエンド
 
Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02
 
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 UG 広島 #2 | SORACOM の紹介から SORACOM Conference "Discovery" 2018 SORACOM ...
 
アカツキはどのようにAWSを活用しているか #jawsug
アカツキはどのようにAWSを活用しているか #jawsugアカツキはどのようにAWSを活用しているか #jawsug
アカツキはどのようにAWSを活用しているか #jawsug
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版
 
日記アプリでCloud kitを使う
日記アプリでCloud kitを使う日記アプリでCloud kitを使う
日記アプリでCloud kitを使う
 
Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下Mbed祭り 2017@春の新横浜 20170225 竹之下
Mbed祭り 2017@春の新横浜 20170225 竹之下
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
 
HTML5時代のwebクリエイターに必要なこと
HTML5時代のwebクリエイターに必要なことHTML5時代のwebクリエイターに必要なこと
HTML5時代のwebクリエイターに必要なこと
 
Xamarin.Forms概要
Xamarin.Forms概要Xamarin.Forms概要
Xamarin.Forms概要
 
Cloud kitを使った日記アプリで写真をどう扱うか
Cloud kitを使った日記アプリで写真をどう扱うかCloud kitを使った日記アプリで写真をどう扱うか
Cloud kitを使った日記アプリで写真をどう扱うか
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
 
Azureお助けサービス概要
Azureお助けサービス概要Azureお助けサービス概要
Azureお助けサービス概要
 
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
 
Endo kitura on_bluemix
Endo kitura on_bluemixEndo kitura on_bluemix
Endo kitura on_bluemix
 
使い倒そう Visual Studio Code! ~クラウド連携や遠隔ペアプロ、  もちろん Git も便利に~
使い倒そう Visual Studio Code!~クラウド連携や遠隔ペアプロ、 もちろん Git も便利に~使い倒そう Visual Studio Code!~クラウド連携や遠隔ペアプロ、 もちろん Git も便利に~
使い倒そう Visual Studio Code! ~クラウド連携や遠隔ペアプロ、  もちろん Git も便利に~
 
20120413 nestakabaneworkshop
20120413 nestakabaneworkshop20120413 nestakabaneworkshop
20120413 nestakabaneworkshop
 
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
Visual Studio Codeを使い倒そう! ~プログラミングから機械学習、クラウド連携、遠隔ペアプロまで~
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 

Más de yaegashi

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

Más de yaegashi (14)

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

Último

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 

Último (10)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

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!