Go Academy · บทเรียน

การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์

สร้างตัวทำซีเรียลไลเซอร์อย่างง่ายคล้าย JSON ด้วย reflect

บทเรียน 4 จาก 413 ขั้นตอน

การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. reflect.Type และ reflect.Value
  2. ตรวจสอบฟิลด์และแท็กของสตรักต์
  3. การเรียกฟังก์ชันแบบไดนามิก
  4. การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์
← กลับไปที่ Go Academy