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でリフレクションする、その前に / Kansai.go #1
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
utagawa kiki
May 25, 2024
Programming
4
3.7k
Goでリフレクションする、その前に / Kansai.go #1
Kansai.go #1 LT
https://umedago.connpass.com/event/316604/
utagawa kiki
May 25, 2024
Tweet
Share
More Decks by utagawa kiki
See All by utagawa kiki
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.4k
tparseでgo testの出力を見やすくする
utgwkk
2
670
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
4
1.2k
自動で //nolint を挿入する取り組み / Gopher's Gathering
utgwkk
1
1.9k
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
3.4k
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
21
17k
Dive into gomock / Go Conference 2024
utgwkk
14
8.4k
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
7
4.3k
ありがとう、create-react-app
utgwkk
4
12k
Other Decks in Programming
See All in Programming
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
1k
Ruby and LLM Ecosystem 2nd
koic
1
950
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
340
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
5
1.7k
API Platformを活用したPHPによる本格的なWeb API開発 / api-platform-book-intro
ttskch
1
140
AHC061解説
shun_pi
0
390
安いハードウェアでVulkan
fadis
0
260
Claude Codeログ基盤の構築
giginet
PRO
7
3.4k
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
210
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
5
1k
Fundamentals of Software Engineering In the Age of AI
therealdanvega
2
260
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
140
Featured
See All Featured
Leo the Paperboy
mayatellez
4
1.5k
Testing 201, or: Great Expectations
jmmastey
46
8.1k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.3k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
290
Visualization
eitanlees
150
17k
Darren the Foodie - Storyboard
khoart
PRO
3
2.9k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
Music & Morning Musume
bryan
47
7.1k
Believing is Seeing
oripsolob
1
86
A Tale of Four Properties
chriscoyier
163
24k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Transcript
Goでリフレクションする、その 前に Kansai.go #1 @utgwkk (うたがわきき)
自己紹介 @utgwkk (うたがわきき) 株式会社はてな Webアプリケーションエンジニア in 京都 好きなパッケージはreflect
ここで宣伝 Go Conference 2024 (6/8) で登壇します Dive into gomockというタイトルでやります 渋谷で会いましょう
リフレクション 実行時にプログラムの情報を読み書きすること Goでは、主にreflectパッケージを使うことで実現できる 例: 実行時に型情報を取得する、struct tagの情報を取得する、など
こんなとこにもリフレクション (1) encoding/json パッケージによるJSONシリアライズ・デシリアライズ type S struct { X int
`json:"x"` Y string `json:"y" Z int `json:"z,omitempty"` } b, _ := json.Marshal(S{X: 100, Y: "hello"}) fmt.Println(string(b)) // {"x":100,"y":"hello"}
こんなとこにもリフレクション (2) github.com/jmoiron/sqlx を使ったDBアクセス type User struct { Id int
`db:"id"` Name string `db:"name"` } user := User{} _ = db.GetContext( ctx, &user, `SELECT * FROM user WHERE id = ?`, id, )
こんなとこにもリフレクション (3) github.com/caarlos0/env を使った環境変数のパース type Config struct { Addr string
`env:"ADDR"` IsLocal bool `env:"IS_LOCAL" envDefault:"false"` } cfg := Config{} _ = env.Parse(&cfg)
リフレクションを使いたくなったらまず立ち止まる 生きていると一度はリフレクションを使いたくなる (こともある) ここでいったん深呼吸しましょう それ、リフレクションじゃなくてもできるのでは??
素直に実装する まずは素直に書いてみましょう…… 型やinterfaceをうまく活用すると実現できるかもしれない 分岐の数が限られているなら素直に書いたほうが早い
ジェネリクス Go 1.18からジェネリクスが導入された スライスやmapに対する操作を書きやすくなっている any型の登場頻度が減っている
コード生成 対象となるデータ型が限られているなら非常に有効 リフレクションよりも高速であることが期待しやすい コード生成特有のテクニックは求められるかも
それでもリフレクションを使うなら ようこそリフレクションへ
リフレクションは黒魔術 実質的にany型しかない (動的型だと思って書く) ランタイムの気持ちになりながらコードを書く 前提条件チェックに失敗するとすぐpanicする
リフレクションが有効な場面 対象となるデータ型の範囲を絞れない (ライブラリとか) 型やinterfaceを活用するだけでは実現できない 実行時の型情報にアクセスしたい struct tagを活用したい 実行速度やメモリ効率をさほど気にしなくてもよい
リフレクションを使うプログラミングのコツ デバッガを差し込む (あるいはprintデバッグする) ランタイムの気持ちになる ポインタと値が厳密に区別されることを頭に叩き込む reflectパッケージのドキュメントや実装を読む リフレクションを使ったライブラリの実装を参考にする
リフレクションを使ったライブラリの実装を参考にする よく使われている・テストされているライブラリは考慮が行き届いているだろう このあたりが読みやすい (発表者の意見です) github.com/caarlos0/env github.com/jmoiron/sqlx
まとめ リフレクションを使わずに解決できないか、最初に検討しよう 用法用量を守って正しくリフレクションと付き合おう リフレクションで手札が広がるのと同時に、自分の身を自分で守ることになる
最後に宣伝 Goのリフレクションと向き合う同人誌を書きました (去年の冬に) booth.pm で購入できます https://utgwkk.booth.pm/items/5376961