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
独自ファイル形式にStructTagで立ち向かう
Search
atsushi-ishibashi
June 10, 2019
Technology
0
53
独自ファイル形式にStructTagで立ち向かう
atsushi-ishibashi
June 10, 2019
Tweet
Share
More Decks by atsushi-ishibashi
See All by atsushi-ishibashi
コンテナ運用におけるアプリケーション設定管理
atsushi51
0
450
モダンなアーキテクチャでゼロから作る証券基盤
atsushi51
1
2.5k
Goによるスキーマ駆動開発
atsushi51
1
1.7k
AWSにおけるクラウドネイティブでセキュアな証券システムの運用
atsushi51
0
120
クラウドインフラの権限
atsushi51
0
52
AWSとGo言語とコンテナによる証券プラットフォーム
atsushi51
0
66
StepFunctionsフルコース
atsushi51
0
83
DevSecOps実践
atsushi51
0
120
Other Decks in Technology
See All in Technology
ホワイトボードチャレンジ 説明&実行資料
ichimichi
0
130
運用しているアプリケーションのDBのリプレイスをやってみた
miura55
1
750
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
あれは良かった、あれは苦労したB2B2C型SaaSの新規開発におけるCloud Spanner
hirohito1108
2
640
ビジネスモデリング道場 目的と背景
masuda220
PRO
9
560
室長と気ままに学ぶマイクロソフトのビジネスアプリケーションとビジネスプロセス
ryoheig0405
0
370
滅・サービスクラス🔥 / Destruction Service Class
sinsoku
6
1.6k
エンジニアのためのドキュメント力基礎講座〜構造化思考から始めよう〜(2025/02/15jbug広島#15発表資料)
yasuoyasuo
18
6.9k
Helm , Kustomize に代わる !? 次世代 k8s パッケージマネージャー Glasskube 入門 / glasskube-entry
parupappa2929
0
250
Classmethod AI Talks(CATs) #16 司会進行スライド(2025.02.12) / classmethod-ai-talks-aka-cats_moderator-slides_vol16_2025-02-12
shinyaa31
0
110
(機械学習システムでも) SLO から始める信頼性構築 - ゆる SRE#9 2025/02/21
daigo0927
0
150
Platform Engineeringは自由のめまい
nwiizo
4
2.1k
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
A designer walks into a library…
pauljervisheath
205
24k
Building Your Own Lightsaber
phodgson
104
6.2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
410
Into the Great Unknown - MozCon
thekraken
35
1.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
4 Signs Your Business is Dying
shpigford
182
22k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Statistics for Hackers
jakevdp
797
220k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Designing Experiences People Love
moore
140
23k
Transcript
ಠࣗϑΝΠϧܗࣜʹ StructTagͰཱ͔ͪ͏ Finatext ੴڮ ३ࢤ
Finatext
None
None
ࣗݾհ - ੴڮ३ࢤ • ࡏֶதʹFinatextʹؔΘΔ • εϚʔτϓϥεͷূ݊γεςϜͷઃܭɾߏஙΛ ୲ • ࠒ͍ͬͯΔݴޠɿGoݴޠ
• terraform-provider-awsʹͦͦ͜͜ߩݙ • झຯɿαφ • @bashi0501
StructTagͬͯ·͔͢ʁ
• json, xml • form, query • db • validate
(gopkg.in/go- playground/validator.v9) Α͘͏λά
• ͋ΔϑΥʔϚοτͷΤϯίʔυ/ σίʔυΛָ͍ͨ͠ • ΞϊςʔγϣϯͰॲཧ༰Λઃఆ ͍ͨ͠ ༻్
TagΛࣗ࡞ͨ͜͠ͱ͋Δਓ!
ͲΜͳϑΝΠϧʁ • SHIFT_JIS • ݻఆ
encoding/jsonύοέʔδʹ฿ͬͯ 2ͭͷؔΛ࣮ package custom func Unmarshal(p []byte, v interface{}) error
func Marshal(v interface{}) ([]byte, error)
func Unmarshal(p []byte, v interface{}) error { //reflect.Value tt :=
reflect.ValueOf(v) // reflect.Kind // ΈࠐΈܕ,Ptr,Interface,StructͳͲͷܕΛද͢enum if tt.Kind() != reflect.Ptr { return error } // PtrͷnilνΣοΫ if tt.IsNil() { return error } // Elem returns the value that interface contains or that pointer points to elem := tt.Elem() fmt.Println(elem.Kind()) // struct … Unmarshal
func Unmarshal(p []byte, v interface{}) error { … elem :=
tt.Elem() //reflect.Type // t := elem.Type() //֤fieldʹରͯ͠ॲཧΛ͍ͯ͘͠ for i := 0; i < t.NumField(); i++ { //reflect.StructField //Field໊ܕɺTagͳͲͷใΛࢀরͰ͖Δ field := t.Field(i) fmt.Println(field.Name) //field໊ fmt.Println(field.Type.Kind()) //reflect.Kindͱͯ͠ͷܕ fmt.Println(field.Type.Name()) //typeએݴΛࣝผ͍ͨ͠ͱ͖ tag, ok := field.Tag.Lookup(“tagName”) //͋ͱtagΛύʔεͯ͠p []byte͔Β͏·͍͜ͱσʔλऔ͖ͬͯͯ elem.Field(i).SetXXX(foo(p)) } }
func Marshal(v interface{}) ([]byte, error) { tt := reflect.ValueOf(v) switch
rv.Kind() { case reflect.Ptr, reflect.Interface: if rv.IsNil() { return nil, error } tt = tt.Elem() case reflect.Struct: default: return nil, error } t := tt.Type() for i := 0; i < t.NumField(); i++ { field := rt.Field(i) tag, ok := field.Tag.Lookup(“tagName”) // do something ttf := tt.Field(i) switch ttf.Kind() { case reflect.String: stringValue := ttf.String() // ग़ྗ͢Δ[]byteʹରͯ͠ૢ࡞ Marshal
type Hoge struct { ID string `custom:”1,5”` // 1byte͔Β5byte Count
int64 `custom:”6,2”` IsFlag bool `custom:"8,1"` Price float64 `custom:"9,5"` Abs uint64 `custom:"14,3"` } p := []byte(`abcde101002.3543`) var hoge Hoge Unmarshal(p, &hoge) hoge.ID // abcde hoge.Count // 10 hoge.IsFlag // true hoge.Price // 2.3 hoge.Abs // 543 Unmarshalͷྫ
type Hoge struct { ID string `custom:”1,5"` Count int64 `custom:”6,2”`
IsFlag bool `custom:"8,1"` Price float64 `custom:"9,5"` Abs uint64 `custom:"14,3"` } hoge := Hoge{ ID: “abcde”, Count: “10”, IsFlag: true, Price: 2.3, Abs: 543, } p, err := Marshal(hoge) fmt.Println(string(p)) // abcde101002.3543 Marshalͷྫ
ಠ༷ࣗͷϑΝΠϧ Ͱͷ࿈ܞ ಠࣗϑΥʔϚοτ Ͱͷ௨৴ ؆୯ʹѻ͑Δ
͍ɺ ͦͦಠࣗϑΥʔϚοτ ࠷ޙͷखஈ$
• ৭Μͳ͜ͱग़དྷͦ͏ͳؾʹͳΔ ͕ɺͦΕͨͿΜTagͰΔ͜ ͱ͡Όͳ͍ • ࡞Βͳͯ͘ྑ͍ʹӽͨ͜͠ͱ ͳ͍ ·ͱΊ