Menu
CoddyTech

回顾:简单计时器

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 65 课,共 68 课。

challenge icon

挑战

简单

创建一个倒计时应用,使用 time.NewTicker 从指定时长倒数到零,并定期显示进度消息。这个挑战将考查你结合计时器、循环和时长计算来创建实用计时应用的能力。

你会收到两个输入:

  • 一个字符串,包含格式为 "value:unit" 的倒计时时长(例如 "10:Second" 或 "3:Minute")
  • 一个字符串,包含格式为 "value:unit" 的更新间隔(例如 "1:Second")

你的任务是:

  1. 通过按冒号拆分第一个输入,提取倒计时时长的值和单位
  2. 通过按冒号拆分第二个输入,提取更新间隔的值和单位
  3. 使用 strconv 包将字符串值转换为整数
  4. 使用相应的常量,为倒计时时长和更新间隔创建 time.Duration 对象:
    • 对于 "Second":乘以 time.Second
    • 对于 "Minute":乘以 time.Minute
    • 对于 "Hour":乘以 time.Hour
  5. 显示计时器标题:"=== COUNTDOWN TIMER ==="
  6. 显示计时器设置:"Starting countdown from [countdown_duration_object]"
  7. 显示更新频率:"Updates every [update_interval_object]"
  8. 使用更新间隔时长,通过 time.NewTicker 创建一个计时器
  9. 使用倒计时时长初始化剩余时间变量
  10. 使用循环进行倒计时:
    • 使用 <-ticker.C 等待每次计时器事件
    • 从剩余时间中减去更新间隔
    • 如果剩余时间大于 0,显示:"Time remaining: [remaining_time_object]"
    • 如果剩余时间小于或等于 0,显示:"Time's up!" 并退出循环
  11. 使用 ticker.Stop() 停止计时器
  12. 显示完成统计信息:
    • "=== TIMER COMPLETE ==="
    • "Original duration: [countdown_duration_object]"
    • "Update interval: [update_interval_object]"
    • "Total updates displayed: [number_of_updates]"(计算剩余时间显示的次数)
  13. 显示完成消息:"Countdown timer finished successfully"

使用 time 包进行计时器和时长操作,使用 strings 包拆分输入字符串,使用 strconv 包将字符串转换为整数,并使用 fmt 包输出。请记住,time.NewTicker 会返回一个计时器,它会定期通过自己的通道发送值;完成后,你必须调用 ticker.Stop() 来释放资源。这个挑战展示了如何使用 Go 的计时机制创建实用的倒计时器。

亲手试试

package main

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

func main() {
	// 读取输入
	var countdownInput string
	var intervalInput string
	fmt.Scanln(&countdownInput)
	fmt.Scanln(&intervalInput)
	
	// 解析倒计时时长输入
	countdownParts := strings.Split(countdownInput, ":")
	countdownValue, _ := strconv.Atoi(countdownParts[0])
	countdownUnit := countdownParts[1]
	
	// 解析更新间隔输入
	intervalParts := strings.Split(intervalInput, ":")
	intervalValue, _ := strconv.Atoi(intervalParts[0])
	intervalUnit := intervalParts[1]
	
	// TODO: 在下面编写你的代码
	// 使用 switch 语句转换为 time.Duration 对象
	// 创建倒计时器(测试时模拟运行,不实际等待)
	// 实现倒计时循环
	// 显示所有要求的消息和统计信息
	// 注意:为了便于测试,模拟定时器的行为,不实际等待
	
}

逻辑与流程中的所有课

自己练习: Go 在线编译器