Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Goでリフレクションする、その前に / Kansai.go #1
Search
utagawa kiki
May 25, 2024
Programming
3.8k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goでリフレクションする、その前に / Kansai.go #1
Kansai.go #1 LT
https://umedago.connpass.com/event/316604/
utagawa kiki
May 25, 2024
More Decks by utagawa kiki
See All by utagawa kiki
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
2
1.6k
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
4.8k
tparseでgo testの出力を見やすくする
utgwkk
2
2.3k
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
4
2.8k
自動で //nolint を挿入する取り組み / Gopher's Gathering
utgwkk
1
3.5k
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
4.6k
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
21
18k
Dive into gomock / Go Conference 2024
utgwkk
14
8.8k
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
7
4.4k
Other Decks in Programming
See All in Programming
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
260
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.5k
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
210
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
270
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
310
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
110
AHC070解法紹介
eijirou
0
140
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
300
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
440
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
260
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
580
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
7k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
920
Google's AI Overviews - The New Search
badams
0
1.6k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.1k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
900
Abbi's Birthday
coloredviolet
4
10k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
530
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
610
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
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