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

คำสั่ง select

มัลติเพล็กซ์แชนเนลด้วย select

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

select คืออะไร

คำสั่ง select ช่วยให้โกโรทีนรอการดำเนินการกับช่องสัญญาณหลายช่องพร้อมกัน คำสั่งนี้จะเลือก case แรกที่พร้อมดำเนินการ คล้ายกับ switch แต่ใช้กับช่องสัญญาณ

ไวยากรณ์พื้นฐาน

case แต่ละรายการใน select จะเป็นการส่งหรือรับข้อมูลผ่านช่องสัญญาณ:

select {
case msg := <-ch1:
    fmt.Println("ch1:", msg)
case msg := <-ch2:
    fmt.Println("ch2:", msg)
}

การทำงานแบบไม่บล็อกด้วย default

การเพิ่ม case default ทำให้ select ทำงานแบบไม่บล็อก — หากไม่มีช่องสัญญาณใดพร้อม คำสั่งจะไปยัง default ทันที

select {
case v := <-ch:
    fmt.Println(v)
default:
    fmt.Println("no value ready")
}

การเลือกแบบสุ่ม

เมื่อมีหลาย case ที่พร้อมทำงานในเวลาเดียวกัน Go จะเลือกหนึ่งรายการแบบสุ่ม — ทุก case ที่พร้อมมีโอกาสถูกเลือกเท่ากัน วิธีนี้ช่วยป้องกันการอดรอการทำงาน

การส่งข้อมูลใน select

case สามารถเป็นการส่งข้อมูลผ่านช่องสัญญาณได้เช่นกัน case สำหรับส่งจะพร้อมทำงานเมื่อช่องสัญญาณมีพื้นที่ในบัฟเฟอร์ (หรือมีผู้รับกำลังรออยู่)

select {
case ch1 <- val1:
    fmt.Println("sent to ch1")
case ch2 <- val2:
    fmt.Println("sent to ch2")
}

select ว่างจะบล็อกตลอดไป

select{} เปล่าที่ไม่มี case จะบล็อกโกโรทีนปัจจุบันตลอดไป นี่เป็นรูปแบบที่ใช้กันทั่วไปเพื่อให้โกโรทีนหลักยังทำงานอยู่ขณะที่โกโรทีนอื่นทำงาน

func main() {
    go serve()
    select {} // block forever
}

การวนซ้ำด้วย select

ห่อ select ไว้ภายในลูป for เพื่อจัดการช่องสัญญาณหลายช่องอย่างต่อเนื่อง เพิ่มช่องสัญญาณ done เพื่อออกจากลูปอย่างเรียบร้อย

for {
    select {
    case v := <-data:
        process(v)
    case <-done:
        return
    }
}

ช่องสัญญาณ nil

ช่องสัญญาณ nil จะบล็อกตลอดไปเมื่ออยู่ใน case ของ select ทำให้ case นั้นถูกปิดใช้งานโดยปริยาย คุณสามารถใช้คุณสมบัตินี้เพื่อเปิดหรือปิด case แบบไดนามิกขณะโปรแกรมทำงาน

var ch chan int // nil
select {
case v := <-ch: // never selected
    _ = v
case v := <-other:
    fmt.Println(v)
}

select กับช่องสัญญาณที่ปิดแล้ว

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

select {
case v, ok := <-ch:
    if !ok { return } // channel closed
    use(v)
}

รูปแบบการจัดลำดับความสำคัญ

Go select ไม่รองรับลำดับความสำคัญโดยตรง หากต้องการให้ช่องสัญญาณหนึ่งมีความสำคัญสูงกว่า ให้ซ้อน select หรือใช้ลูปที่ตรวจสอบช่องสัญญาณ highPriority ก่อนโดยมี default

for {
    select {
    case v := <-highPriority:
        handle(v)
    default:
        select {
        case v := <-lowPriority:
            handle(v)
        }
    }
}

ทบทวนจนถึงตอนนี้

select รอช่องสัญญาณหลายช่อง เลือก case ที่พร้อมแบบสุ่ม รองรับ default เพื่อทำงานแบบไม่บล็อก และช่องสัญญาณ nil จะปิดใช้งาน case รูปแบบที่ใช้บ่อยคือ for+select+done

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เมื่อมีหลาย case ใน select พร้อมทำงานในเวลาเดียวกัน จะเกิดอะไรขึ้น

ทบทวน: คำสั่ง select

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

  • select จะบล็อกจนกว่า case ของช่องสัญญาณหนึ่งรายการจะพร้อมทำงาน
  • มีหลาย case พร้อมกัน → เลือกแบบสุ่ม
  • default ทำให้การทำงานไม่บล็อก
  • ช่องสัญญาณ nil จะปิดใช้งาน case ของตัวเอง
  • for+select+done เป็นลูปมาตรฐานสำหรับจัดการช่องสัญญาณหลายช่อง

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

บทเรียน “คำสั่ง select” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “คำสั่ง select”

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

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

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

บทเรียน “คำสั่ง select” ใช้เวลานานแค่ไหน

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

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

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

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

  1. คำสั่ง select
  2. การหมดเวลาและตัวนับช่วงเวลา
  3. รูปแบบ Fan-in และ Fan-out
  4. รูปแบบกลุ่มผู้ทำงาน
← กลับไปที่ Go Academy