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.
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à:
- Tách đầu vào thứ nhất theo dấu phẩy để lấy từng bước thiền
- 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)
- Dùng gói
strconvđể chuyển các chuỗi thời lượng thành số nguyên - Chuyển đầu vào thứ hai thành số nguyên để lấy số vòng lặp
- Hiển thị tiêu đề buổi thiền:
"=== MEDITATION TIMER ===" - Hiển thị phần thiết lập buổi thiền:
"Starting meditation session with [number_of_cycles] cycles" - 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ớitime.Millisecond, như trongtime.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)"
- Hiển thị:
- Sau khi hoàn thành mọi bước trong một vòng lặp, hiển thị:
"Cycle [cycle_number] finished"
- Hiển thị:
- 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)
- 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
}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
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm7Xử lý lỗi chuyên sâu
Kiểu lỗi tùy chỉnhBọc lỗi bằng `%w`Gỡ bọc lỗi bằng `errors.Is`Gỡ bọc lỗi bằng `errors.As`Tìm hiểu `panic`Sử dụng `recover`Ôn tập: phép chia an toàn10Làm việc với thời gian
Lấy thời gian hiện tạiTạo thời điểm cụ thểĐịnh dạng thời gianPhân tích chuỗi thời gianKhoảng thời gianPhép tính thời gianTạm dừng và bộ đánh dấu thời gianÔn tập: Bộ hẹn giờ đơn giản2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online