スリープとティッカー
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 64/68。
プログラムの実行タイミングを制御する必要がある場合があります。Goは、そのための2つの重要な関数を time パッケージで提供しています。実行を一時停止するための time.Sleep と、一定の間隔でアクションを実行するための time.NewTicker です。
time.Sleep 関数は、指定された期間プログラムを一時停止します。これは time.Duration を引数として受け取り、その時間が経過するまで実行をブロックします:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")一定の間隔でアクションを繰り返す場合、time.NewTicker は、指定された間隔でチャネルに値を送信するティッカーを作成します。これは、定期的に実行する必要があるタスクに役立ちます。
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // 次のティックを待機
fmt.Println("Tick", i+1)
}これらのタイミング関数は、Goプログラムにおいて遅延の作成、タイムアウトの実装、および定期的な操作のスケジューリングを行うために不可欠です。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単time.Sleep を使用してガイド付きの指示の間に一時停止を作り、Goプログラムにおける基本的なタイミング制御を実演する瞑想セッションタイマーを作成してください。
2つの入力を受け取ります:
"step1:duration,step2:duration,step3:duration"という形式の瞑想ステップを含む文字列(例:"Breathe in:3,Hold:2,Breathe out:4")- 繰り返すサイクル数を含む文字列(例:
"5")
あなたのタスクは以下の通りです:
- 最初の入力をカンマで分割して、個々の瞑想ステップを取得するように解析します
- 各ステップについて、コロンで分割して指示(instruction)と期間(duration、秒単位)を抽出します
strconvパッケージを使用して、期間の文字列を整数に変換します- 2番目の入力を整数に変換して、サイクル数を取得します
- セッションヘッダーを表示します:
"=== MEDITATION TIMER ===" - セッションの設定を表示します:
"Starting meditation session with [number_of_cycles] cycles" - 各サイクル(サイクル1から開始)について:
- 表示:
"--- Cycle [cycle_number] ---" - 各瞑想ステップについて:
- 表示:
"[instruction]..." time.Sleepを使用して、指定された期間だけ一時停止します(秒をtime.Secondで掛けることによりtime.Durationに変換します)- スリープ後、表示します:
"[instruction] complete ([duration] seconds)"
- 表示:
- サイクル内のすべてのステップを完了した後、表示します:
"Cycle [cycle_number] finished"
- 表示:
- すべてのサイクルが完了した後、セッションの概要を表示します:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(すべてのステップの期間の合計にサイクル数を掛けたもの)
- 完了メッセージを表示します:
"Meditation session finished - well done!"
スリープ操作には time パッケージ、入力文字列の分割には strings パッケージ、文字列から整数への変換には strconv パッケージ、そして出力には fmt パッケージを使用してください。time.Sleep は time.Duration パラメータを受け取るため、適切な期間の値を作成するには整数の秒数に time.Second を掛ける必要があることに注意してください。このチャレンジでは、ガイド付き瞑想やエクササイズタイマーのような実用的なアプリケーションのために、time.Sleep を使用してプログラムの実行に時間指定の一時停止を作る方法を学びます。
チートシート
time.Sleep を使用して、指定した時間だけプログラムの実行を一時停止します:
time.Sleep(2 * time.Second)time.NewTicker を使用して、一定の間隔でアクションを実行します:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // 次のティックを待ちます
fmt.Println("Tick", i+1)
}どちらの関数も time.Duration 値を使用します。整数に time.Second を掛けることで、期間(duration)に変換します。
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// スペースを適切に処理するために bufio.Scanner を使用して入力を読み込む
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// 瞑想のステップとサイクルを解析する
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: 以下にコードを記述してください
// 各ステップを解析して、指示と時間を抽出する
// アクセスする前に、parts スライスに十分な要素があるか確認することを忘れないように
// セッションのヘッダーとセットアップを表示する
// サイクルとステップをループで処理する
// 一時停止には time.Sleep を使用する(テスト用にはミリ秒の使用を検討してください)
// 完了メッセージと概要を表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。