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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
130
tparseでgo testの出力を見やすくする
utgwkk
2
550
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
4
1k
自動で //nolint を挿入する取り組み / Gopher's Gathering
utgwkk
1
1.8k
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
3.3k
君たちはどうコードをレビューする (される) か / 大吉祥寺.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
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
aki_pin0
0
110
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
200
今、アーキテクトとして 品質保証にどう関わるか
nealle
0
190
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
220
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
200
CopilotKit + AG-UIを学ぶ
nearme_tech
PRO
1
110
NOT A HOTEL - 建築や人と融合し、自由を創り出すソフトウェア
not_a_hokuts
2
470
atmaCup #23でAIコーディングを活用した話
ml_bear
4
700
受け入れテスト駆動開発(ATDD)×AI駆動開発 AI時代のATDDの取り組み方を考える
kztakasaki
2
480
日本だけで解禁されているアプリ起動の方法
ryunakayama
0
360
AI活用のコスパを最大化する方法
ochtum
0
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
320
Featured
See All Featured
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
300
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
87
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Fireside Chat
paigeccino
41
3.8k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
67
37k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
78
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
Code Reviewing Like a Champion
maltzj
527
40k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
2
65
Building Flexible Design Systems
yeseniaperezcruz
330
40k
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