เหตุผลที่มี 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุผลที่มี context.Context
- WithCancel และ WithTimeout
- WithDeadline และ WithValue
- Context ในการเรียกใช้ HTTP และฐานข้อมูล