Menu
CoddyTech

时间间隔

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

在 Go 中处理时间时,你经常需要表示一段时间,比如“5 minutes”或“2 hours”。Go 提供了 time.Duration 类型,专门用于此目的。

time.Duration 表示两个时刻之间的一段时间。Go 提供了几个预定义常量,让创建时间段变得简单易读:

tenMinutes := 10 * time.Minute
twoHours := 2 * time.Hour
thirtySeconds := 30 * time.Second

最常用的时长常量有 time.Nanosecond、time.Microsecond、time.Millisecond、time.Second、time.Minute 和 time.Hour。你可以将这些常量乘以整数,创建所需的精确时长。

持续时间值对于时间运算、安排操作以及控制程序中的计时至关重要。它们可以与其他时间函数无缝配合,并提供一种清晰易读的方式,用于在代码中表示时间跨度。

challenge icon

挑战

简单

创建一个锻炼课程计时器,使用 time.Duration 跟踪不同的锻炼时长和休息时长。这个挑战将测试你使用 Go 预定义常量创建时长值并进行计算的能力。

你将收到两个输入:

  • 一个包含锻炼定义的字符串,格式为 "exercise1:duration_value:duration_unit,exercise2:duration_value:duration_unit"(例如,"Push-ups:30:Second,Plank:2:Minute,Squats:45:Second")
  • 一个包含休息时长信息的字符串,格式为 "rest_duration_value:rest_duration_unit"(例如,"15:Second")

你的任务是:

  1. 通过按逗号拆分第一个输入,获取每个锻炼条目
  2. 对于每个锻炼条目,按冒号拆分,提取锻炼名称、时长值(字符串)和时长单位
  3. 通过按冒号拆分第二个输入,获取休息时长值和单位
  4. 将时长值从字符串转换为整数,并使用相应的常量创建 time.Duration 对象:
    • 对于 "Second":乘以 time.Second
    • 对于 "Minute":乘以 time.Minute
    • 对于 "Hour":乘以 time.Hour
  5. 显示应用程序标题:"=== WORKOUT SESSION TIMER ==="
  6. 显示课程设置:"Setting up workout session..."
  7. 对于每项锻炼,显示:"Exercise: [exercise_name] - Duration: [duration_object]"
  8. 显示休息时长:"Rest period between exercises: [rest_duration_object]"
  9. 计算并显示课程概要:
    • "=== SESSION BREAKDOWN ==="
    • 对于每项锻炼:"[exercise_name]: [duration_in_seconds] seconds"
    • "Rest periods: [rest_duration_in_seconds] seconds each"
  10. 计算课程总时长(所有锻炼时长加上锻炼之间的休息时长):
    • "=== TIMING CALCULATIONS ==="
    • "Total exercise time: [total_exercise_duration_object]"
    • "Total rest time: [total_rest_duration_object]"(锻炼之间的休息时长,因此比锻炼次数少 1 次)
    • "Complete session duration: [total_session_duration_object]"
  11. 显示课程统计信息:
    • "=== SESSION STATISTICS ==="
    • "Number of exercises: [number_of_exercises]"
    • "Longest exercise: [longest_exercise_name] ([longest_duration_object])"
    • "Shortest exercise: [shortest_exercise_name] ([shortest_duration_object])"
    • "Average exercise duration: [average_duration_in_seconds] seconds"
  12. 显示时长换算结果:
    • "=== TIME CONVERSIONS ==="
    • "Session duration in minutes: [total_minutes]"(将课程总时长转换为分钟)
    • "Session duration in hours: [total_hours]"(将课程总时长转换为小时,并以小数形式显示)
  13. 显示完成消息:"Workout session timer configured successfully"

使用 time 包处理时长,使用 strings 包拆分输入字符串,使用 strconv 包将字符串形式的数字转换为整数,并使用 fmt 包进行格式化输出。请记住,time.Duration 值可以相加,也可以使用 Seconds()、Minutes() 和 Hours() 等方法转换为不同的单位。这个挑战将展示如何为计时应用创建和操作时长值。

亲手试试

package main

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

func main() {
	// 读取输入
	var exerciseInput string
	var restInput string
	fmt.Scanln(&exerciseInput)
	fmt.Scanln(&restInput)
	
	// 从输入中解析各项运动
	exerciseEntries := strings.Split(exerciseInput, ",")
	
	// 从输入中解析休息时长
	restParts := strings.Split(restInput, ":")
	
	// TODO:在下方编写你的代码
	// 1. 解析每项运动,提取名称、时长值和单位
	// 2. 将时长值转换为整数,并创建 time.Duration 对象
	// 3. 解析休息时长,并创建 time.Duration 对象
	// 4. 显示锻炼安排的信息和计算结果
	// 5. 计算锻炼安排的统计数据并转换时间单位
	
	// 记得按照挑战要求输出所有必要信息
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器