0Pricing
Go Academy · บทเรียน

reflect.Type และ reflect.Value

TypeOf, ValueOf, Kind และ Elem

reflect.Type และ reflect.Value เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมแพ็กเกจ reflect

แพ็กเกจ reflect ช่วยให้โปรแกรม Go ตรวจสอบชนิดและค่าได้ขณะทำงาน และเป็นรากฐานของไลบรารีการเข้ารหัสแบบต่าง ๆ ระบบ ORM และเฟรมเวิร์กการฉีดส่วนอ้างอิง

reflect.TypeOf

reflect.TypeOf(x) ส่งคืน reflect.Type ของค่าของ x:

t := reflect.TypeOf(42)
fmt.Println(t.Name())    // "int"
fmt.Println(t.Kind())    // "int"
fmt.Println(t.String())  // "int"

reflect.ValueOf

reflect.ValueOf(x) ส่งคืน reflect.Value ที่เก็บ x ไว้ คุณสามารถอ่านค่าด้วยเมธอดเฉพาะของ Kind:

v := reflect.ValueOf(42)
fmt.Println(v.Kind())    // "int"
fmt.Println(v.Int())     // 42

Type.Kind เทียบกับ Type.Name

Kind คือหมวดหมู่พื้นฐานของ Go เช่น int, struct, ptr และ slice ส่วน Name คือชื่อชนิดข้อมูลที่ประกาศไว้ เช่น "MyStruct" อินเทอร์เฟซมี Kind == Interface แต่ไม่มี Name

ฟิลด์ของโครงสร้าง

ตรวจสอบฟิลด์ของโครงสร้างผ่าน Type.NumField() และ Type.Field(i) ซึ่งส่งคืน reflect.StructField:

t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
    f := t.Field(i)
    fmt.Printf("Field: %s Type: %s Tag: %s\n", f.Name, f.Type, f.Tag.Get("json"))
}

การอ่านค่าฟิลด์ของโครงสร้าง

ใช้ Value.FieldByName หรือ Value.Field(i) เพื่ออ่านค่าฟิลด์ขณะทำงาน:

v := reflect.ValueOf(user)
nameField := v.FieldByName("Name")
fmt.Println(nameField.String()) // "Alice"

การกำหนดค่าฟิลด์ของโครงสร้าง

หากต้องการกำหนดค่าให้ฟิลด์ ค่านั้นต้องระบุตำแหน่งที่อยู่ได้ โดยส่งผ่านพอยน์เตอร์:

v := reflect.ValueOf(&user).Elem()
v.FieldByName("Name").SetString("Bob")

การอ้างอิงพอยน์เตอร์ทางอ้อม

หากค่าเป็นพอยน์เตอร์ ให้เรียกใช้ v.Elem() เพื่อรับค่าที่พอยน์เตอร์ชี้ไป ตรวจสอบ v.Kind() == reflect.Ptr ก่อน

if v.Kind() == reflect.Ptr {
    v = v.Elem()
}

reflect.New

สร้างค่าศูนย์ใหม่ของชนิดข้อมูลหนึ่ง และรับพอยน์เตอร์ไปยังค่านั้น:

t := reflect.TypeOf(User{})
ptr := reflect.New(t) // *User
user := ptr.Interface().(*User)

การเรียกใช้เมธอด

เรียกใช้เมธอดตามชื่อบนค่าที่ผ่านการตรวจสอบแบบสะท้อน:

v := reflect.ValueOf(user)
m := v.MethodByName("Greet")
results := m.Call(nil)
fmt.Println(results[0].String())

ประสิทธิภาพ

การตรวจสอบแบบสะท้อนช้ากว่าโค้ดโดยตรง 5–10 เท่า ให้แคชการค้นหา reflect.Type และ reflect.Value ไว้นอกลูปที่ทำงานบ่อย และใช้การสร้างโค้ดเมื่อประสิทธิภาพมีความสำคัญมาก

ตรวจสอบอย่างรวดเร็ว

อะไรคือความแตกต่างระหว่าง reflect.Type.Kind() และ reflect.Type.Name()

สรุป: reflect.Type และ reflect.Value

ประเด็นสำคัญ:

  • ใช้ reflect.TypeOf/ValueOf เพื่อตรวจสอบชนิดข้อมูลขณะทำงาน
  • Kind: หมวดหมู่พื้นฐาน ส่วน Name: ชื่อที่ประกาศไว้
  • ใช้ Value.FieldByName ร่วมกับ SetXxx เพื่อจัดการฟิลด์ของโครงสร้าง
  • ส่งพอยน์เตอร์และเรียกใช้ Elem() สำหรับค่าที่กำหนดค่าได้

คำถามที่พบบ่อย

บทเรียน “reflect.Type และ reflect.Value” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “reflect.Type และ reflect.Value” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “reflect.Type และ reflect.Value”

TypeOf, ValueOf, Kind และ Elem คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “reflect.Type และ reflect.Value” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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