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
97
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
独自ファイル形式にStructTagで立ち向かう
atsushi-ishibashi
June 10, 2019
More Decks by atsushi-ishibashi
See All by atsushi-ishibashi
コンテナ運用におけるアプリケーション設定管理
atsushi51
0
520
モダンなアーキテクチャでゼロから作る証券基盤
atsushi51
1
2.9k
Goによるスキーマ駆動開発
atsushi51
1
1.8k
AWSにおけるクラウドネイティブでセキュアな証券システムの運用
atsushi51
0
150
クラウドインフラの権限
atsushi51
0
84
AWSとGo言語とコンテナによる証券プラットフォーム
atsushi51
0
85
StepFunctionsフルコース
atsushi51
0
120
DevSecOps実践
atsushi51
0
160
Other Decks in Technology
See All in Technology
はてなのサービス基盤を支える Kubernetes《足腰》
masayoshimaezawa
0
170
AI 不只幫你寫 Code: 當專案從 300 暴增到 1500, 我們如何撐住 DevOps
appleboy
0
280
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
180
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
210
ご挨拶「10周年を迎える共創ラボのこれまでとこれから」
iotcomjpadmin
0
150
從觀望到全公司落地:AI Agentic Coding 導入實戰 — 流程整合與安全治理
appleboy
0
160
AI時代における最適なQA組織の作り方
ymty
3
160
AIエージェントとPhysical AIが拓く製造業の変革(ハノーバーメッセリキャップ)
iotcomjpadmin
0
160
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
210
GitHub Copilot運用のリアル ~AI Credit時代にどう向き合うか~
takafumisu2uk1
0
490
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.6k
2026-06-24_人とAIの責務分離に基づく開発プロセスの提案.pdf
takahiromatsui
0
250
Featured
See All Featured
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
220
Into the Great Unknown - MozCon
thekraken
41
2.6k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
260
A Modern Web Designer's Workflow
chriscoyier
698
190k
Embracing the Ebb and Flow
colly
88
5.1k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
350
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
870
Test your architecture with Archunit
thirion
1
2.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
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ͰΔ͜ ͱ͡Όͳ͍ • ࡞Βͳͯ͘ྑ͍ʹӽͨ͜͠ͱ ͳ͍ ·ͱΊ