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
絶対にExportされてないフィールドを書き換えるなよ!絶対だぞ!絶対! / golang.t...
Search
morikuni
December 18, 2018
Programming
240
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
絶対にExportされてないフィールドを書き換えるなよ!絶対だぞ!絶対! / golang.tokyo#20
morikuni
December 18, 2018
More Decks by morikuni
See All by morikuni
エラー設計について / Designing Errors
morikuni
7
3.2k
GopherCon 2018/2019
morikuni
0
100
Architecture & Go kit
morikuni
2
2.1k
ホリネズミでもわかるGoroutine入門 / golang.tokyo#14
morikuni
12
9k
DIコンテナを使わないDI / golang.tokyo#11
morikuni
4
15k
Other Decks in Programming
See All in Programming
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
230
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
320
AIエージェントの隔離技術の徹底比較
kawayu
0
470
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
680
LLM Plugin for Node-REDの利用方法と開発について
404background
0
160
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
510
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
640
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.4k
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
100
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
150
Featured
See All Featured
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
Being A Developer After 40
akosma
91
590k
Scaling GitHub
holman
464
140k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
720
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
830
The SEO identity crisis: Don't let AI make you average
varn
0
480
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
550
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
380
Transcript
絶対にExportされてないフィールドを書き換える なよ!絶対だぞ!絶対! golang.tokyo #20
About me • morikuni • https://twitter.com/inukirom • https://github.com/morikuni • Mercari
Microservices Development • Go & Application Architecture • mercari.go に来て!
絶対にExportされてないフィールドを書き換える なよ!絶対だぞ!絶対!
「あれ?Exportされてないフィールドってそ もそも書き換えられないよね?何言ってる の?」 Goの有識者の声
書き換えに成功して しまいまいした。 大変申し訳ありませんが github.com/morikuni/go-experiment/overwrite
Usage import ( "testing" "github.com/morikuni/go-experiment/overwrite" "github.com/morikuni/go-experiment/overwrite/internal" ) func TestField(t *testing.T)
{ x := internal.NewX("aaa") overwrite.Field(&x, "val", "bbb") if got, want := x.Get(), "bbb"; got != want { t.Errorf("got %v, want %v", got, want) } } package internal type X struct { val string } func (x X) Get()string { return x.val } func NewX(a string) X{ return X{a} }
Implementation func Field(target interface{}, field string, val interface{}) error {
targetVal := reflect.Indirect(reflect.ValueOf(target)) // セットするstructのreflect.Valueをとる if targetVal.Kind() != reflect.Struct { return ErrNotStruct } dstVal := targetVal.FieldByName(field) // セットするフィールドのreflect.Valueをとる if !dstVal.IsValid() { return ErrNoSuchField } srcVal := reflect.ValueOf(val) // セットする値のreflect.Valueをとる if srcVal.Type() != dstVal.Type() { return ErrTypeMismatch } dstAddr := unsafe.Pointer(dstVal.UnsafeAddr()) // セットするフィールドのアドレスをとる setableField := reflect.NewAt(dstVal.Type(), dstAddr).Elem() // セットするフィールドのアドレスにval型の変数を作成する setableField.Set(srcVal) // setableFieldはただの変数なので値をセットできる return nil }
まとめ • Exportされていないフィールドを書き換えました • 絶対に本番環境ではつかうなよ!絶対だぞ!絶対!