Submit Search
Upload
筋肉によるGoコードジェネレーション
•
4 likes
•
4,485 views
L
lestrrat
Follow
github.com/lestrrat/go-slackを主軸として、筋肉(fmt.Fprintf)を使ったコードジェネレーションを紹介
Read less
Read more
Internet
Report
Share
Report
Share
1 of 50
Download now
Download to read offline
Recommended
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
智啓 出川
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
Machinationの紹介
Machinationの紹介
Kazuhisa Minato
各種データベースの特徴とパフォーマンス比較
各種データベースの特徴とパフォーマンス比較
株式会社オプト 仙台ラボラトリ
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
Yusuke Mori
凡人の凡人による凡人のためのデザインパターン第一幕 Public
凡人の凡人による凡人のためのデザインパターン第一幕 Public
bonjin6770 Kurosawa
Recommended
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細(様々なメモリの利用)
智啓 出川
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
Machinationの紹介
Machinationの紹介
Kazuhisa Minato
各種データベースの特徴とパフォーマンス比較
各種データベースの特徴とパフォーマンス比較
株式会社オプト 仙台ラボラトリ
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
Yusuke Mori
凡人の凡人による凡人のためのデザインパターン第一幕 Public
凡人の凡人による凡人のためのデザインパターン第一幕 Public
bonjin6770 Kurosawa
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
TIS Inc.
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
昌桓 李
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
MITSUNARI Shigeo
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
Atsushi Nakamura
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
フラグを愛でる
フラグを愛でる
MITSUNARI Shigeo
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
Ryoma Sin'ya
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
Protocol Buffers 入門
Protocol Buffers 入門
Yuichi Ito
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
Keiichiro Ono
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Takuya Kawabe
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
GitHub最新情報キャッチアップ 2023年6月
GitHub最新情報キャッチアップ 2023年6月
Kazumi IWANAGA
Yapc2012資料
Yapc2012資料
matsuo kenji
More Related Content
What's hot
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
TIS Inc.
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
昌桓 李
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
MITSUNARI Shigeo
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
Atsushi Nakamura
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
フラグを愛でる
フラグを愛でる
MITSUNARI Shigeo
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
Ryoma Sin'ya
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
Protocol Buffers 入門
Protocol Buffers 入門
Yuichi Ito
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
Keiichiro Ono
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Takuya Kawabe
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
What's hot
(20)
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
フラグを愛でる
フラグを愛でる
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
Protocol Buffers 入門
Protocol Buffers 入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
『繋がり』を見る: Cytoscapeと周辺ツールを使ったグラフデータ可視化入門
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
TLS, HTTP/2演習
TLS, HTTP/2演習
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
プログラムを高速化する話
プログラムを高速化する話
Similar to 筋肉によるGoコードジェネレーション
GitHub最新情報キャッチアップ 2023年6月
GitHub最新情報キャッチアップ 2023年6月
Kazumi IWANAGA
Yapc2012資料
Yapc2012資料
matsuo kenji
Gitlab meetup prm説明資料_2017_1117
Gitlab meetup prm説明資料_2017_1117
Tetsuya Sato
今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築
You&I
gitを使って、レポジトリの一部抽出forkしてみました
gitを使って、レポジトリの一部抽出forkしてみました
Takako Miyagawa
GitHub Copilotとともに次の開発体験へ
GitHub Copilotとともに次の開発体験へ
Kazumi IWANAGA
[Lt]versionごとにurlを自動生成
[Lt]versionごとにurlを自動生成
shouta yoshikai
Shizudev git hub宿題
Shizudev git hub宿題
Tadahiro Ishisaka
Programming AWS with Python
Programming AWS with Python
Yasuhiro Matsuo
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
genroku
オープンセミナー香川2012 LT
オープンセミナー香川2012 LT
Kouta Imanaka
Dropbox APIなどを使って制作を効率化しよう@関西オープンフォーラム
Dropbox APIなどを使って制作を効率化しよう@関西オープンフォーラム
Masayuki Abe
Metahub for github
Metahub for github
Suguru Oho
20120827勉強会 webアプリ作ってみた2
20120827勉強会 webアプリ作ってみた2
Shugo Numano
Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!
ymmt
プログラミング支援AI GitHub Copilot すごいの話
プログラミング支援AI GitHub Copilot すごいの話
Mitsushige Ishiguro
GitHub Handson
GitHub Handson
Yoichiro Shimizu
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
Takeshi Mikami
oFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer Workout
Tsuubito Ishii
LINEにおける GitHub Enterpriseの活用事例と LINE Notifyについて
LINEにおける GitHub Enterpriseの活用事例と LINE Notifyについて
LINE Corporation
Similar to 筋肉によるGoコードジェネレーション
(20)
GitHub最新情報キャッチアップ 2023年6月
GitHub最新情報キャッチアップ 2023年6月
Yapc2012資料
Yapc2012資料
Gitlab meetup prm説明資料_2017_1117
Gitlab meetup prm説明資料_2017_1117
今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築
gitを使って、レポジトリの一部抽出forkしてみました
gitを使って、レポジトリの一部抽出forkしてみました
GitHub Copilotとともに次の開発体験へ
GitHub Copilotとともに次の開発体験へ
[Lt]versionごとにurlを自動生成
[Lt]versionごとにurlを自動生成
Shizudev git hub宿題
Shizudev git hub宿題
Programming AWS with Python
Programming AWS with Python
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
オープンセミナー香川2012 LT
オープンセミナー香川2012 LT
Dropbox APIなどを使って制作を効率化しよう@関西オープンフォーラム
Dropbox APIなどを使って制作を効率化しよう@関西オープンフォーラム
Metahub for github
Metahub for github
20120827勉強会 webアプリ作ってみた2
20120827勉強会 webアプリ作ってみた2
Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!
プログラミング支援AI GitHub Copilot すごいの話
プログラミング支援AI GitHub Copilot すごいの話
GitHub Handson
GitHub Handson
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
oFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer Workout
LINEにおける GitHub Enterpriseの活用事例と LINE Notifyについて
LINEにおける GitHub Enterpriseの活用事例と LINE Notifyについて
More from lestrrat
Future of Tech "Conferences"
Future of Tech "Conferences"
lestrrat
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
lestrrat
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
lestrrat
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
lestrrat
Rejectcon 2018
Rejectcon 2018
lestrrat
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
lestrrat
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
lestrrat
Google container builderと友だちになるまで
Google container builderと友だちになるまで
lestrrat
iosdc 2017
iosdc 2017
lestrrat
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
lestrrat
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
lestrrat
Coding in the context era
Coding in the context era
lestrrat
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
lestrrat
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
lestrrat
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
lestrrat
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
lestrrat
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
lestrrat
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
lestrrat
How To Think In Go
How To Think In Go
lestrrat
On internationalcommunityrelations
On internationalcommunityrelations
lestrrat
More from lestrrat
(20)
Future of Tech "Conferences"
Future of Tech "Conferences"
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
Rejectcon 2018
Rejectcon 2018
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
Google container builderと友だちになるまで
Google container builderと友だちになるまで
iosdc 2017
iosdc 2017
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
Coding in the context era
Coding in the context era
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
How To Think In Go
How To Think In Go
On internationalcommunityrelations
On internationalcommunityrelations
筋肉によるGoコードジェネレーション
1.
による Go コードジェネレーション kamakura.go #3 2018/1/20 株式会社
HDE 牧大輔 (@lestrrat) Brute-force Code Generation In Go 筋 肉
2.
• @lestrrat • Perl/Go
hacker, author, father • Author of github.com/peco/peco • Organizer for builderscon
3.
agenda 1. go-slack 2. 私流コードジェネレーション 3.
コードジェネレーションtips 4. 反省とまとめ
4.
<宣伝> http://blog.builderscon.io/entry/call-for-sponsors-2018 スポンサー募集中!!!
5.
go-slack
6.
クライアント • APIが完全自動生成 (endpoints.jsonを編集) •
APIが完全にGoogle風味 (google.golang.org/api) 自動生成前提 →大量のAPIが存在する時にはとても重要
7.
自動生成:なぜ? • 以前github.com/nlopes/slackにPR送ったりしていたら • ひとつの仕組みを直すのに20ファイルを手動で変更する 必要があった
8.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx)
9.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) まず「サービス」を取得じゃ! サービスは論理的なグルーピングの ことじゃな
10.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) メソッドを呼ぶための 「Callオブジェクト」を作成するぞ! 必須引数もここで指定じゃ。
11.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) Callオブジェクトに任意引数を 付与していくぞい。
12.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) 最後にDoでようやく リクエスト送信じゃ!
13.
サーバー • モックサーバー・プロキシサーバーを完全自動生成! • Slackへの通信をインターセプト! •
ボットが無駄にポストしなくなる!
14.
Previously… development instance chat.postMessage api.slack.com Multiple Messages production instance chat.postMessage
15.
slaproxy development instance auth.test api.slack.com Only prod production instance chat.postMessage chat.postMessage slaproxy
16.
slaproxy development instance auth.test api.slack.com Only prod production instance chat.postMessage chat.postMessage slaproxy 副作用のないメソッド だけ本番にパススルー するんじゃ!
17.
Kubernetesと相性良い! • 本番Service (type=ExternalName,
api.slack.com) • 開発Service (type=ClusterIP, slaproxy Pod) • どちらもクライアント側からは slack.$namespace.svc.cluster.local に見える
18.
コードジェネレーション
19.
Goでコードジェネレーションしてる・したことある人?
20.
手法は? • ASTを作成して printer.Fprintf?
(このドMがッ!) • Perl/Python/Ruby/PHPから生成? • text/templateで生成?
21.
俺のおすすめ?
22.
筋 肉
23.
fmt.Fprintf
24.
• schemalex/schemalex • go-jsval •
go-libxml2 internal/cmd/gen* • go-slack • go-msgpack • go-ical • go-jsschema 拙作のライブラリではinternal以下にコマンドを 仕込んでおき、go generateから呼んでる
25.
• schemalex/schemalex • go-jsval •
go-libxml2 internal/cmd/gen* • go-slack • go-msgpack • go-ical • go-jsschema 拙作のライブラリではinternal以下にコマンドを 仕込んでおき、go generateから呼んでる internal 以下なら godocには載らないんじゃ!
26.
endpoints.json 定義は適当なJSONファイルに放り込んである
27.
go generate あとは go
generateから呼べるようにしておくだけ
28.
go generate あとは go
generateから呼べるようにしておくだけ サーバもクライアントも 同じ定義から作れるので とっても便利じゃ!
29.
.oO(こいつ、なんでテンプ レート使わないんだろ…?
30.
利点:ただのGoコード • 他のGo資源を使える • 分岐・再利用ブロックの制御が簡単
31.
text/templateの限界に 挑戦する必要がない • 「は!今のコンテキストからはグローバルな変数に直接アクセスできない…」 • 「あれ、この文字列を処理する関数をちょっと入れたいだけなのに…
なに? FuncMapだぁ?」 • 「補助関数・変数一杯いれたけど、一体今どれが有効なのかわからん!」 利点:
32.
text/templateの限界に 挑戦する必要がない • 「は!今のコンテキストからはグローバルな変数に直接アクセスできない…」 • 「あれ、この文字列を処理する関数をちょっと入れたいだけなのに…
なに? FuncMapだぁ?」 • 「補助関数・変数一杯いれたけど、一体今どれが有効なのかわからん!」 利点: 個人的には、簡単な テンプレート以外で使う text/templateはクソじゃと 思っておる!
33.
利点:Goなら整形も簡単 • 改行だけ気をつけていれば細かいところは format.Sourceが良きように計らってくれる
34.
コードジェネレーション Tips 筋 肉
35.
Tip: Optionパターンが便利 • 任意の0~N個の引数を好きな順番で与える事ができる •
メソッドチェーンと同じく「メソッドの正しい引数の順 番」を考えるより楽 • 必須でない引数に便利 slack.New( token, // 必須なので、Optionではない slack.WithDebug(true), // デバッグ有効化 slack.WithClient(&http.Client{}), // http.Clientをカスタマイズしたい )
36.
Tip: メソッドチェーンは便利 • メソッドを呼ぶと、呼び出したオブジェクトを戻り値と して返す •
メソッドの呼び出し順を(ほとんど)考えずに済む •「メソッドの正しい引数の順番」を考えるより楽 slackClient.Chat(). // go-slackの場合… PostMessage(…). // ここまでは必須。 Attachment(…). // ここから任意引数を… EscapeText(false). // メソッドチェーン。 Do(ctx) // 最後にDo()を呼ぶと発火
37.
Tip: メソッドは”.n”から if (addMethod1)
{ fmt.Fprintf(“.nMethod1()”) } if (addMethod2) { fmt.Fprintf(“.nMethod2()”) }
38.
• 以下はパース失敗する Foo() .Method1() .Method2() • 以下はパース成功する Foo(). Method1(). Method2() Tip:
メソッドは”.n”から “n.” “.n”
39.
Tip: 定義対象は必ずソートする • 元々リストから生成するならやらなくてもOK •
マップから生成するクラス名、メソッド名、etc… • 順番が安定しないと、diffがおかしなことになる
40.
Tip: 無駄に思えても、1行ずつ • 一気にPrint(複数行)とかしたくなるけど、我慢 •
あとで何かを差し込みたくなったり、条件分岐する時に そのほうが楽
41.
Tip: 改行は最初に • ブロックの開始を「予測」するより、ブロック開始時に2 個改行を入れるのが簡単
42.
Tip: 生成されたファイル名を揃える • 後悔するので、必ずファイル名から生成されたことがわ かるようにしましょう •
“xxxxx_gen.go” 等で揃えるとよい
43.
Tip: CIでgit diffをチェック •
生成されたファイルがチャントコミットできてるか確認 • 結構漏れるので注意 • トラックされていないファイルは “git ls-files -- others —exclude-standard" https://github.com/lestrrat/go-slack/blob/master/scripts/check-diff.sh
44.
反省
45.
決してわかりやすくは無い… • 正直に言えば、コードジェネレータを「誰でも」読み解 けるかというと疑問が残る • 必要な時だけ行うべき
46.
それでもやるべき瞬間(とき) • 今回のような機械的なコードの羅列がある場合 • そして、とにかくその数が多い •
「自分がイチイチ変更していくと絶対エンバグするぞ」 という時
47.
まとめ
48.
fmt.Fprintfも結構使える • テンプレートの書き方で悩むくらいなら、悩む時間 がもったい無いので筋肉で書けば良いのではないか (言うほど難しくない) • 慣れれば生成されたコードが心の眼で浮き上がって くるようになります
49.
おまけ
50.
ジェネリックス? • 欲しい時もあるけど、こういう時ではない • 長年やってきて、凝縮されてエレガントなコードよ り、機械的に量産できるシンプル・愚直なコードの ほうが良い気がしてる •
というわけで今のGoでも充分
Download now