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

defer เทียบกับ errdefer ในทางปฏิบัติ

เลือกแบบทำงานเสมอหรือทำงานเมื่อเกิดข้อผิดพลาด

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

คำสำคัญสำหรับการเก็บกวาดสองแบบ

Zig มีเครื่องมือกำหนดเวลาสองแบบ: defer ทำงานเสมอ ส่วน errdefer ทำงานเฉพาะเมื่อ scope สิ้นสุดพร้อมข้อผิดพลาด

defer หมายถึงทำเสมอ

ใช้ defer เมื่อการเก็บกวาดต้องเกิดขึ้นไม่ว่าอะไรจะเกิด เช่น การปิดไฟล์ที่คุณเปิดไว้ตลอดทั้งฟังก์ชัน

const f = try open();
defer f.close();

errdefer หมายถึงทำเมื่อไม่สำเร็จ

errdefer จะทำงานเฉพาะเมื่อ scope ออกจากฟังก์ชันด้วยข้อผิดพลาด หากคืนค่าสำเร็จก็จะถูกข้ามไปอย่างเงียบ ๆ

const buf = try alloc();
errdefer free(buf);

เหตุผลที่ข้ามเมื่อสำเร็จ

บางครั้งคุณสร้างค่าเพื่อ คืนค่านั้น เมื่อสำเร็จ ผู้เรียกจะเป็นเจ้าของค่า ดังนั้นคุณต้องไม่ free ค่านั้น และ errdefer ก็เคารพกฎนี้

ออบเจ็กต์ที่สร้างไม่เสร็จ

errdefer มีประโยชน์มากใน ตัวสร้าง หากขั้นตอนภายหลังล้มเหลว มันจะย้อนคืนการจองหน่วยความจำก่อนหน้า จึงไม่เกิดการรั่วไหลของออบเจ็กต์ที่สร้างค้างไว้

const a = try alloc();
errdefer free(a);
const b = try alloc();

เมื่อสำเร็จจึงโอนความเป็นเจ้าของ

เมื่อทุกขั้นตอนสำเร็จ ฟังก์ชันจะคืนค่า และ errdefer จะไม่ทำงาน ความเป็นเจ้าของจึงโอนไปยังผู้เรียกได้อย่างเรียบร้อย

return MyType{ .a = a, .b = b };

ใช้ร่วมกันได้อย่างลงตัว

คุณสามารถใช้ทั้งสองแบบร่วมกันได้ defer ดูแลหน่วยความจำชั่วคราวที่ใช้ทำงาน ส่วน errdefer ปกป้องผลลัพธ์ที่คุณวางแผนจะคืน

ทั้งสองแบบเคารพลำดับย้อนกลับ

เช่นเดียวกับ defer, errdefer หลายรายการจะถูกนำออกตามลำดับ ย้อนกลับ เมื่อเกิดข้อผิดพลาด Zig จะเรียกใช้ defer และ errdefer ที่ตรงกันร่วมกัน โดยเริ่มจากรายการใหม่สุด

ตำแหน่งมีความสำคัญ

วาง errdefer แต่ละรายการไว้ ทันทีหลังขั้นตอนที่รายการนั้นปกป้องอยู่ เพราะมันจะดูแลเฉพาะข้อผิดพลาดที่เกิดหลังจากมาถึงบรรทัดของตัวเอง

กฎง่าย ๆ

ถามเพียงคำถามเดียว: การเก็บกวาดนี้ควรทำเมื่อสำเร็จด้วยหรือไม่ หากใช่ ให้ใช้ defer หากทำเฉพาะเมื่อเกิดข้อผิดพลาด ให้ใช้ errdefer

ปลอดจากการรั่วไหลตั้งแต่การออกแบบ

คำสำคัญทั้งสองช่วยให้คุณเขียนฟังก์ชันที่ ไม่มีทรัพยากรรั่วไหล ในทุกเส้นทาง ไม่ว่าจะสำเร็จหรือล้มเหลว โดยไม่ต้องติดตามด้วยตนเอง

ตรวจสอบความเข้าใจ

errdefer ทำงานเมื่อใดเมื่อเทียบกับ defer

สรุปทบทวน

เลือกใช้ defer เมื่อการเก็บกวาดต้องทำเสมอ และใช้ errdefer เมื่อต้องการย้อนคืนการทำงานเฉพาะบนเส้นทางที่เกิดข้อผิดพลาด ✅

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

บทเรียน “defer เทียบกับ errdefer ในทางปฏิบัติ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “defer เทียบกับ errdefer ในทางปฏิบัติ”

เลือกแบบทำงานเสมอหรือทำงานเมื่อเกิดข้อผิดพลาด คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “defer เทียบกับ errdefer ในทางปฏิบัติ” ใช้เวลานานแค่ไหน

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

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

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

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

  1. สิ่งที่ defer รับประกัน
  2. ลำดับการทำงานของ defer หลายรายการ
  3. defer เทียบกับ errdefer ในทางปฏิบัติ
  4. จับคู่ Open กับ Close
← กลับไปที่ Zig Academy