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

เหตุผลที่มี context.Context

การยกเลิกและการจัดการวงจรชีวิตของคำขอ

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

ปัญหา

หากไม่มีกลไกสำหรับยกเลิกงานที่กำลังทำอยู่ คำค้นฐานข้อมูลหรือการเรียก HTTP ที่ใช้เวลานานจะทำให้โกโรทีนของคำค้นหรือการเรียกนั้นบล็อกจนกว่าจะเสร็จสิ้น ส่งผลให้สิ้นเปลืองทรัพยากรเมื่อคำขอเดิมถูกละทิ้งไปแล้ว

ภาพรวมของ context.Context

context.Context เป็นอินเทอร์เฟซที่ส่งต่อสัญญาณยกเลิก กำหนดเวลาสิ้นสุดที่มีหรือไม่มีก็ได้ และเมทาดาทาแบบคีย์-ค่าข้ามขอบเขต API และโกโรทีน

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key any) any
}

ช่องสัญญาณ Done

ctx.Done() จะส่งคืนช่องสัญญาณที่ถูกปิดเมื่อบริบทถูกยกเลิกหรือหมดเวลา โกโรทีนจะเลือกตรวจสอบช่องสัญญาณนี้เพื่อรับรู้การยกเลิก

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

context.Background()

context.Background() คือบริบทต้นราก ซึ่งไม่ถูกยกเลิก ไม่มีกำหนดเวลาสิ้นสุด และไม่มีค่าใด ๆ ใช้บริบทนี้ที่จุดเริ่มต้นของคำขอ ใน main หรือในการทดสอบ

context.TODO()

context.TODO() เป็นบริบทต้นรากที่ไม่สามารถยกเลิกได้เช่นกัน ใช้เป็นตัวยึดแทนเมื่อยังไม่พร้อมใช้บริบทที่ถูกต้อง การใช้บริบทนี้สื่อเจตนาให้ผู้ตรวจทานทราบ

เหตุใดจึงส่ง Context เป็นอาร์กิวเมนต์แรก

ตามแบบแผน พารามิเตอร์แรกของฟังก์ชันใดก็ตามที่สามารถยกเลิกได้คือ ctx context.Context ทำให้การยกเลิกระบุไว้อย่างชัดเจนและค้นพบได้ง่ายใน API

func FetchUser(ctx context.Context, id int) (*User, error) {
    return db.QueryContext(ctx, "SELECT ...", id)
}

การยกเลิกส่งต่อไปยังบริบทอื่น

การยกเลิกบริบทแม่จะยกเลิกบริบทลูกที่สร้างต่อมาทั้งหมด ทำให้การเรียกยกเลิกเพียงครั้งเดียวสามารถหยุดต้นไม้ทั้งหมดของโกโรทีนและการดำเนินการได้

สิ่งที่ Context ไม่ใช่

Context ไม่ใช่ถุงเก็บค่าทั่วไป ควรใช้เฉพาะกับข้อมูลที่อยู่ในขอบเขตของคำขอ เช่น รหัสการติดตามหรือโทเค็นยืนยันตัวตน ไม่ใช่พารามิเตอร์เสริม ควรเก็บค่าเหล่านี้ไว้ในโครงสร้างที่ระบุชนิด

การผสานรวมกับไลบรารีมาตรฐาน

ไคลเอ็นต์ HTTP, ไดรเวอร์ SQL, gRPC และแพ็กเกจจากผู้พัฒนาภายนอกอีกมากมายของไลบรารีมาตรฐานรองรับ Context ทำให้การยกเลิกส่งต่อไปตลอดสแตกการเรียกได้

การเก็บ Context ในโครงสร้าง

ห้ามเก็บ Context ไว้ภายในโครงสร้าง ควรส่งเป็นอาร์กิวเมนต์ของฟังก์ชันอย่างชัดเจน การเก็บไว้ในโครงสร้างทำให้อายุการใช้งานของการยกเลิกไม่ชัดเจน และมักนำไปสู่ข้อผิดพลาด

Context เปลี่ยนแปลงไม่ได้

Context เปลี่ยนแปลงไม่ได้ คุณสร้างบริบทใหม่โดยห่อหุ้มด้วย WithCancel, WithDeadline, WithTimeout หรือ WithValue โดยบริบทแม่จะไม่ถูกแก้ไข

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

ctx.Done() ส่งคืนอะไร

สรุป: context.Context

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

  • ส่งต่อการยกเลิก กำหนดเวลาสิ้นสุด และเมทาดาทาข้ามโกโรทีน
  • ส่งเป็นอาร์กิวเมนต์แรก และห้ามเก็บไว้ในโครงสร้าง
  • ช่องสัญญาณ ctx.Done() จะถูกปิดเมื่อมีการยกเลิกหรือหมดเวลา
  • การยกเลิกส่งต่อจากบริบทแม่ไปยังบริบทลูกทั้งหมด

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

บทเรียน “เหตุผลที่มี context.Context” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “เหตุผลที่มี context.Context”

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

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

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

บทเรียน “เหตุผลที่มี context.Context” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เหตุผลที่มี context.Context
  2. WithCancel และ WithTimeout
  3. WithDeadline และ WithValue
  4. Context ในการเรียกใช้ HTTP และฐานข้อมูล
← กลับไปที่ Go Academy