Menu
CoddyTech

Tạm dừng và bộ đánh dấu thời gian

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 64 trên 68.

Đôi khi bạn cần kiểm soát thời gian chạy của chương trình. Go cung cấp hai hàm thiết yếu trong package time để làm việc này: time.Sleep để tạm dừng chương trình và time.NewTicker để thực hiện hành động theo các khoảng thời gian đều đặn.

Hàm time.Sleep tạm dừng chương trình trong một khoảng thời gian xác định. Hàm này nhận time.Duration làm tham số và chặn việc thực thi cho đến khi hết khoảng thời gian đó:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

Với các thao tác lặp lại theo khoảng thời gian đều đặn, time.NewTicker tạo một ticker gửi giá trị qua một channel theo những khoảng thời gian đã chỉ định. Điều này hữu ích cho các tác vụ cần chạy định kỳ:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // Chờ tick tiếp theo
    fmt.Println("Tick", i+1)
}

Các hàm tính thời gian này rất cần thiết để tạo độ trễ, triển khai thời gian chờ và lên lịch cho các thao tác lặp lại trong chương trình Go của bạn.

challenge icon

Thử thách

Dễ

Tạo bộ hẹn giờ cho một buổi thiền, dùng time.Sleep để tạo khoảng dừng giữa các hướng dẫn và minh họa cách điều khiển thời gian cơ bản trong chương trình Go.

Bạn sẽ nhận được hai đầu vào:

  • Một chuỗi chứa các bước thiền theo định dạng "step1:duration,step2:duration,step3:duration" (ví dụ: "Breathe in:3,Hold:2,Breathe out:4")
  • Một chuỗi chứa số vòng lặp cần thực hiện (ví dụ: "5")

Nhiệm vụ của bạn là:

  1. Tách đầu vào thứ nhất theo dấu phẩy để lấy từng bước thiền
  2. Với mỗi bước, tách theo dấu hai chấm để lấy hướng dẫn và thời lượng (tính bằng giây)
  3. Dùng gói strconv để chuyển các chuỗi thời lượng thành số nguyên
  4. Chuyển đầu vào thứ hai thành số nguyên để lấy số vòng lặp
  5. Hiển thị tiêu đề buổi thiền: "=== MEDITATION TIMER ==="
  6. Hiển thị phần thiết lập buổi thiền: "Starting meditation session with [number_of_cycles] cycles"
  7. Với mỗi vòng lặp (bắt đầu từ vòng 1):
    • Hiển thị: "--- Cycle [cycle_number] ---"
    • Với mỗi bước thiền:
      • Hiển thị: "[instruction]..."
      • Dùng time.Sleep để tạm dừng trong khoảng thời lượng đã chỉ định (nhân thời lượng với time.Millisecond, như trong time.Duration(duration) * time.Millisecond, để các lượt kiểm tra kết thúc nhanh; đầu ra vẫn ghi đơn vị giây)
      • Sau khi tạm dừng, hiển thị: "[instruction] complete ([duration] seconds)"
    • Sau khi hoàn thành mọi bước trong một vòng lặp, hiển thị: "Cycle [cycle_number] finished"
  8. Sau khi hoàn thành mọi vòng lặp, hiển thị phần tổng kết buổi thiền:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (tổng thời lượng của tất cả các bước nhân với số vòng lặp)
  9. Hiển thị thông báo hoàn thành: "Meditation session finished - well done!"

Dùng gói time để tạo khoảng tạm dừng, gói strings để tách chuỗi đầu vào, gói strconv để chuyển chuỗi thành số nguyên và gói fmt để tạo đầu ra. Hãy nhớ rằng time.Sleep nhận tham số kiểu time.Duration, vì vậy hãy chuyển đổi số nguyên trước: time.Duration(duration) * time.Millisecond. Bộ hẹn giờ thực tế sẽ dùng time.Second, nhưng các khoảng dừng nguyên giây sẽ khiến lượt kiểm tra hết thời gian chờ. Thử thách này minh họa cách dùng time.Sleep để tạo các khoảng dừng theo thời gian khi chương trình chạy, phục vụ những ứng dụng thực tế như thiền có hướng dẫn hoặc bộ hẹn giờ tập thể dục.

Tự làm thử

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Đọc đầu vào bằng bufio.Scanner để xử lý khoảng trắng đúng cách
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// Phân tích các bước thiền và số chu kỳ
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: Viết code của bạn bên dưới
	// Phân tích từng bước để lấy hướng dẫn và thời lượng
	// Nhớ kiểm tra lát cắt parts có đủ phần tử trước khi truy cập
	// Hiển thị tiêu đề phiên thiền và phần thiết lập
	// Lặp qua các chu kỳ và các bước
	// Dùng time.Sleep để tạm dừng: time.Duration(duration) * time.Millisecond
	// Hiển thị thông báo hoàn thành và phần tóm tắt
	
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online