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()) // 42Type.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- reflect.Type และ reflect.Value
- ตรวจสอบฟิลด์และแท็กของสตรักต์
- การเรียกฟังก์ชันแบบไดนามิก
- การสะท้อนในทางปฏิบัติ: ตัวทำซีเรียลไลเซอร์