Ôn tập: Bộ hẹn giờ đơn giản
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 65 trên 68.
Thử thách
DễTạo một ứng dụng đếm ngược sử dụng time.NewTicker để đếm từ một khoảng thời gian đã chỉ định về 0, đồng thời hiển thị thông báo tiến độ theo các khoảng thời gian đều đặn. Thử thách này sẽ kiểm tra khả năng kết hợp ticker, vòng lặp và phép tính thời lượng để tạo một ứng dụng hẹn giờ hoạt động.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi chứa khoảng thời gian đếm ngược theo định dạng
"value:unit"(ví dụ:"10:Second"hoặc"3:Minute") - Một chuỗi chứa khoảng thời gian cập nhật theo định dạng
"value:unit"(ví dụ:"1:Second")
Nhiệm vụ của bạn là:
- Phân tích đầu vào thứ nhất bằng cách tách chuỗi tại dấu hai chấm để lấy giá trị và đơn vị của khoảng thời gian đếm ngược
- Phân tích đầu vào thứ hai bằng cách tách chuỗi tại dấu hai chấm để lấy giá trị và đơn vị của khoảng thời gian cập nhật
- Chuyển các giá trị chuỗi thành số nguyên bằng package
strconv - Tạo các đối tượng
time.Durationcho cả khoảng thời gian đếm ngược và khoảng thời gian cập nhật bằng các hằng số phù hợp:- Với
"Second": nhân vớitime.Second - Với
"Minute": nhân vớitime.Minute - Với
"Hour": nhân vớitime.Hour
- Với
- Hiển thị tiêu đề bộ hẹn giờ:
"=== COUNTDOWN TIMER ===" - Hiển thị phần thiết lập bộ hẹn giờ:
"Starting countdown from [countdown_duration_object]" - Hiển thị tần suất cập nhật:
"Updates every [update_interval_object]" - Tạo một ticker bằng
time.NewTickervới khoảng thời gian cập nhật - Khởi tạo một biến thời gian còn lại bằng khoảng thời gian đếm ngược
- Dùng vòng lặp để đếm ngược:
- Chờ từng sự kiện ticker bằng
<-ticker.C - Trừ khoảng thời gian cập nhật khỏi thời gian còn lại
- Nếu thời gian còn lại lớn hơn 0, hiển thị:
"Time remaining: [remaining_time_object]" - Nếu thời gian còn lại bằng 0 hoặc nhỏ hơn, hiển thị:
"Time's up!"rồi thoát vòng lặp
- Chờ từng sự kiện ticker bằng
- Dừng ticker bằng
ticker.Stop() - Hiển thị thống kê hoàn tất:
"=== TIMER COMPLETE ===""Original duration: [countdown_duration_object]""Update interval: [update_interval_object]""Total updates displayed: [number_of_updates]"(tính số lần thời gian còn lại được hiển thị)
- Hiển thị thông báo hoàn tất:
"Countdown timer finished successfully"
Dùng package time cho các thao tác với ticker và thời lượng, package strings để tách chuỗi đầu vào, package strconv để chuyển chuỗi thành số nguyên và package fmt để xuất dữ liệu. Lưu ý rằng time.NewTicker trả về một ticker gửi giá trị qua kênh của nó theo các khoảng thời gian đều đặn. Khi hoàn tất, bạn cần gọi ticker.Stop() để giải phóng tài nguyên. Thử thách này hướng dẫn cách tạo một bộ hẹn giờ đếm ngược thực tế bằng các cơ chế định thời của Go.
Tự làm thử
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Đọc đầu vào
var countdownInput string
var intervalInput string
fmt.Scanln(&countdownInput)
fmt.Scanln(&intervalInput)
// Phân tích đầu vào về thời lượng đếm ngược
countdownParts := strings.Split(countdownInput, ":")
countdownValue, _ := strconv.Atoi(countdownParts[0])
countdownUnit := countdownParts[1]
// Phân tích đầu vào về khoảng thời gian cập nhật
intervalParts := strings.Split(intervalInput, ":")
intervalValue, _ := strconv.Atoi(intervalParts[0])
intervalUnit := intervalParts[1]
// TODO: Viết code bên dưới
// Chuyển thành các đối tượng time.Duration bằng câu lệnh switch
// Tạo bộ đếm thời gian đếm ngược (mô phỏng không có độ trễ thực tế để kiểm thử)
// Triển khai vòng lặp đếm ngược
// Hiển thị tất cả thông báo và số liệu thống kê cần thiết
// Lưu ý: Để kiểm thử, mô phỏng hoạt động của ticker mà không gây ra độ trễ thực tế
}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