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

การกำหนดเวลาตามเวลา

ทำงานเป็นช่วงเวลา

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

การทำงานตามกำหนดเวลา

หลายระบบจำเป็นต้องมีงานที่ทำเป็นระยะ เช่น ล้างไฟล์ชั่วคราวทุกคืน ส่งอีเมลสรุปทุกเช้า หรือเรียกดู API ทุกนาที บทเรียนนี้จะแนะนำการจัดตารางเวลาตามเวลาใน Go โดยใช้ไลบรารีมาตรฐาน

แพ็กเกจ time

แพ็กเกจ time ของ Go เป็นพื้นฐาน เครื่องมือสำคัญมีดังนี้:

  • time.Sleep หยุดกอรูทีนชั่วคราว
  • time.After ส่งคืนช่องสัญญาณที่ทำงานหนึ่งครั้ง
  • time.Ticker ทำงานซ้ำเป็นระยะ
  • time.Timer ทำงานหนึ่งครั้งหลังจากหน่วงเวลา

ลูปแบบง่าย

ตัวจัดตารางเวลาที่ง่ายที่สุดคือ ทำงาน หยุดรอ แล้วทำซ้ำ

package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 0; i < 3; i++ {
        fmt.Println("tick", i)
        time.Sleep(10 * time.Millisecond)
    }
}

เหตุผลที่ Sleep คลาดเคลื่อน

ลูปที่ใช้การหยุดรอจะคลาดเคลื่อน: หากงานใช้เวลา 200 มิลลิวินาทีและคุณหยุดรอ 1 วินาที ช่วงเวลาจริงจะเป็น 1.2 วินาที และความคลาดเคลื่อนจะสะสม หากต้องการช่วงเวลาที่แม่นยำ ให้ใช้ Ticker ซึ่งจะกล่าวถึงในบทเรียนถัดไป

time.After สำหรับการหน่วงเวลาครั้งเดียว

time.After(d) ส่งคืนช่องสัญญาณที่รับข้อมูลหนึ่งครั้งหลังจากระยะเวลา d มีประโยชน์ใน select สำหรับกำหนดเวลาสูงสุด

select {
case <-time.After(2 * time.Second):
    fmt.Println("2s elapsed")
}

time.Timer

Timer ทำงานหนึ่งครั้งและสามารถหยุดหรือเริ่มใหม่ได้ ต่างจาก time.After ที่ไม่สามารถยกเลิกได้

t := time.NewTimer(5 * time.Second)
defer t.Stop()
<-t.C
fmt.Println("fired")

การจัดตารางเวลาเฉพาะ

หากต้องการทำงานในเวลา เช่น ตีสาม ให้คำนวณระยะเวลาจนถึงเวลานั้น แล้วหยุดรอหรือตั้งตัวจับเวลาตามระยะดังกล่าว จากนั้นจัดตารางใหม่สำหรับวันถัดไป

now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), 3, 0, 0, 0, now.Location())
if next.Before(now) {
    next = next.Add(24 * time.Hour)
}
fmt.Println("sleep for", time.Until(next))

ระยะเวลามีประเภทข้อมูล

time.Duration เป็นค่า int64 ที่แสดงจำนวนนาโนวินาที พร้อมค่าคงที่ที่ใช้งานสะดวก เช่น time.Second, time.Minute และ time.Hour ให้คูณค่าเหล่านี้เพื่อเขียนช่วงเวลาให้อ่านง่าย

every := 30 * time.Minute
fmt.Println(every)

นาฬิกาแบบ Monotonic กับนาฬิกาจริง

time.Now ของ Go มีค่าการอ่านแบบ monotonic ซึ่งใช้วัดเวลาที่ผ่านไปและไม่ถูกรบกวนจากการปรับนาฬิกา ให้ใช้ time.Since สำหรับหาระยะเวลา แทนการลบค่าจากนาฬิกาจริง

start := time.Now()
// ... work ...
fmt.Println("took", time.Since(start))

เมื่อใดควรเลือกใช้ไลบรารี

สำหรับตารางเวลาที่ซับซ้อน เช่น "ทุกวันธรรมดาเวลา 9:15" การคำนวณเวลาเองมีโอกาสเกิดข้อผิดพลาดได้ง่าย ไลบรารี robfig/cron ซึ่งจะกล่าวถึงถัดไป สามารถแยกวิเคราะห์นิพจน์ cron ให้คุณได้

ตัวอย่างที่รันได้: คำนวณการทำงานครั้งถัดไป

โปรแกรมนี้ทำงานได้ในตัวและคำนวณระยะเวลาจนถึงจุดเปลี่ยนนาทีถัดไป โดยใช้เฉพาะแพ็กเกจ time

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Date(2026, 1, 1, 10, 30, 45, 0, time.UTC)
    nextMinute := now.Truncate(time.Minute).Add(time.Minute)
    fmt.Println("now:", now.Format("15:04:05"))
    fmt.Println("next run:", nextMinute.Format("15:04:05"))
    fmt.Println("wait:", nextMinute.Sub(now))
}

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

ทดสอบความเข้าใจเรื่องการจัดตารางเวลาตามเวลา

สรุปทบทวน

คุณได้เรียนรู้พื้นฐานการจัดตารางเวลาตามเวลาดังนี้:

  • แพ็กเกจ time มี Sleep, After, Timer และตัวนับจังหวะ
  • ลูปที่ใช้ Sleep จะคลาดเคลื่อน ส่วนตัวนับจังหวะจะรักษาตารางเวลา
  • คำนวณระยะเวลาจนถึงเวลาเป้าหมายด้วย time.Until
  • ใช้ time.Since และนาฬิกาแบบ monotonic เพื่อวัดเวลาที่ผ่านไป

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

บทเรียน “การกำหนดเวลาตามเวลา” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดเวลาตามเวลา”

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

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

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

บทเรียน “การกำหนดเวลาตามเวลา” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การกำหนดเวลาตามเวลา
  2. ไลบรารี robfig/cron
  3. ตัวนับเวลาสำหรับช่วงเวลา
  4. การปิดงานอย่างราบรื่น
← กลับไปที่ Go Academy