การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์
สร้างตัวทำซีเรียลไลเซอร์อย่างง่ายคล้าย JSON ด้วย reflect
การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวมตัวทำอนุกรม JSON แบบกำหนดเอง
การสร้างตัวทำอนุกรมแบบกำหนดเองด้วยรีเฟลกชันเป็นตัวอย่างการใช้รีเฟลกชันในทางปฏิบัติ ได้แก่ การวนดูฟิลด์ของโครงสร้าง การอ่านแท็ก การเข้าถึงค่า และการสร้างผลลัพธ์ ซึ่งเป็นแนวทางเดียวกับที่ encoding/json ใช้ภายใน
การแปลงโครงสร้างเป็นแมปแบบง่าย
แปลงโครงสร้างเป็น map[string]any โดยใช้การตรวจสอบแบบสะท้อน:
func StructToMap(v any) map[string]any {
t := reflect.TypeOf(v)
val := reflect.ValueOf(v)
result := make(map[string]any, t.NumField())
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
if !f.IsExported() { continue }
key := f.Tag.Get("json")
if key == "" { key = f.Name }
result[key] = val.Field(i).Interface()
}
return result
}การจัดการพอยน์เตอร์
ยกเลิกการอ้างอิงฟิลด์ที่เป็นพอยน์เตอร์ก่อนอ่านค่า:
fv := val.Field(i)
if fv.Kind() == reflect.Ptr {
if fv.IsNil() { continue }
fv = fv.Elem()
}การจัดการโครงสร้างที่ซ้อนกัน
ประมวลผลฟิลด์โครงสร้างที่ซ้อนกันแบบเรียกซ้ำ:
if fv.Kind() == reflect.Struct {
result[key] = StructToMap(fv.Interface())
continue
}การรองรับ omitempty
ข้ามฟิลด์ที่มีค่าศูนย์หากแท็กมี "omitempty":
if strings.Contains(tag, "omitempty") && fv.IsZero() { continue }การแปลงแมปเป็นโครงสร้าง (ตัวถอดอนุกรม)
เติมค่าให้โครงสร้างจากแมปโดยจับคู่คีย์ของแมปกับแท็กของฟิลด์:
func MapToStruct(m map[string]any, dest any) {
t := reflect.TypeOf(dest).Elem()
v := reflect.ValueOf(dest).Elem()
for i := 0; i < t.NumField(); i++ {
key := t.Field(i).Tag.Get("json")
if val, ok := m[key]; ok {
v.Field(i).Set(reflect.ValueOf(val))
}
}
}การบังคับชนิดข้อมูล
ค่าจาก JSON ในแมปมักเป็น float64 สำหรับตัวเลข ให้แปลงค่าเป็นชนิดข้อมูลเป้าหมายของฟิลด์เมื่อตั้งค่า:
if f.Type.Kind() == reflect.Int && reflect.TypeOf(val).Kind() == reflect.Float64 {
v.Field(i).SetInt(int64(val.(float64)))
}การแคชข้อมูลเมตาของฟิลด์
แคชการจับคู่ฟิลด์กับแท็กไว้ใน sync.Map โดยใช้ reflect.Type เป็นคีย์ เพื่อหลีกเลี่ยงการทำรีเฟลกชันซ้ำทุกครั้งที่เรียกใช้การทำอนุกรม
ทางเลือกในการสร้างโค้ด
สำหรับเส้นทางการทำงานที่ต้องการประสิทธิภาพสูง ให้สร้างตัวทำอนุกรมเฉพาะชนิดข้อมูลด้วยเครื่องมืออย่าง easyjson หรือ ffjson เครื่องมือเหล่านี้หลีกเลี่ยงการทำรีเฟลกชันขณะทำงานได้ทั้งหมด
เมื่อใดควรสร้างตัวทำอนุกรมแบบกำหนดเอง
ตัวทำอนุกรมแบบกำหนดเองมีประโยชน์สำหรับรูปแบบที่ไม่ใช่ JSON เช่น BSON, Avro และ CSV กฎการเข้ารหัสแบบกำหนดเอง หรือข้อกำหนดด้านประสิทธิภาพที่เข้มงวด สำหรับกรณีใช้งานส่วนใหญ่ encoding/json ก็เพียงพอ
การทดสอบซีเรียลไลเซอร์
การทดสอบแบบไปกลับ: ทำซีเรียลไลซ์โครงสร้างข้อมูลเป็นแมป แล้วทำดีซีเรียลไลซ์กลับ จากนั้นตรวจสอบยืนยันว่าค่าต่าง ๆ ตรงกับต้นฉบับ:
u := User{Name: "Alice", Age: 30}
m := StructToMap(u)
var u2 User
MapToStruct(m, &u2)
assert.Equal(t, u, u2)ตรวจสอบอย่างรวดเร็ว
เหตุใดการแคชเมทาดาทาของฟิลด์จึงสำคัญเมื่อสร้างซีเรียลไลเซอร์ที่อาศัยรีเฟลกชัน
สรุป: ซีเรียลไลเซอร์ที่อาศัยรีเฟลกชัน
ประเด็นสำคัญ:
- วนซ้ำผ่านฟิลด์ด้วย NumField/Field และอ่านแท็กด้วย Tag.Get
- จัดการพอยน์เตอร์ โครงสร้างข้อมูลซ้อนกัน และค่าศูนย์
- แคชเมทาดาทาของฟิลด์ใน sync.Map เพื่อประสิทธิภาพ
- ใช้การสร้างโค้ดเพื่อให้ได้อัตราการประมวลผลสูงสุด
เรียนรู้ Go ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์”
สร้างตัวทำซีเรียลไลเซอร์อย่างง่ายคล้าย JSON ด้วย reflect คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- reflect.Type และ reflect.Value
- ตรวจสอบฟิลด์และแท็กของสตรักต์
- การเรียกฟังก์ชันแบบไดนามิก
- การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์