スリープとティッカー
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 64/68。
プログラムの実行タイミングを制御する必要がある場合があります。Go では、そのために time パッケージに2つの重要な関数が用意されています。実行を一時停止する 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 // 次のtickを待つ
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")
課題は次のとおりです。
- 最初の入力をカンマで分割し、個々の瞑想の手順を取得します。
- 各手順をコロンで分割し、指示と時間(秒)を取り出します。
strconvパッケージを使って、時間を表す文字列を整数に変換します。- 2つ目の入力を整数に変換して、サイクル数を取得します。
- セッションのヘッダーを表示します:
"=== MEDITATION TIMER ===" - セッションのセットアップを表示します:
"Starting meditation session with [number_of_cycles] cycles" - 各サイクル(サイクル1から開始)について、次の処理を行います。
- 次を表示します:
"--- Cycle [cycle_number] ---" - 瞑想の各手順について、次の処理を行います。
- 次を表示します:
"[instruction]..." - 指定された時間だけ一時停止するために、
time.Sleepを使います(チェックがすぐに完了するように、time.Duration(duration) * time.Millisecondのように時間にtime.Millisecondを掛けます。出力には引き続き秒と表示します)。 - スリープの後、次を表示します:
"[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.Duration(duration) * time.Millisecond。実際のタイマーではtime.Secondを使いますが、整数秒単位の一時停止ではチェックがタイムアウトします。この課題では、ガイド付き瞑想や運動用タイマーなどの実用的な用途で、プログラムの実行中に時間を指定した一時停止を作るためのtime.Sleepの使い方を実演します。
自分で試してみよう
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を使用する: time.Duration(duration) * time.Millisecond
// 完了メッセージと概要を表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ