Sleep과 Ticker
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 64번째.
때로는 프로그램 실행의 타이밍을 제어해야 합니다. Go는 이를 위해 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를 만듭니다. 주기적으로 실행해야 하는 작업에 유용합니다:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // 다음 틱을 기다립니다
fmt.Println("Tick", i+1)
}이러한 타이밍 함수는 Go 프로그램에서 지연을 만들고, 시간 제한을 구현하고, 반복 작업을 예약하는 데 필수적입니다.
챌린지
쉬움time.Sleep를 사용해 안내 지시 사이에 멈춤을 만들고, Go 프로그램의 기본적인 시간 제어를 보여 주는 명상 세션 타이머를 만드세요.
두 개의 입력을 받습니다.
- 명상 단계를 포함하는 문자열로, 형식은
"step1:duration,step2:duration,step3:duration"입니다(예:"Breathe in:3,Hold:2,Breathe out:4"). - 반복할 사이클 수를 포함하는 문자열입니다(예:
"5").
해야 할 작업은 다음과 같습니다.
- 첫 번째 입력을 쉼표로 분리해 개별 명상 단계를 가져옵니다.
- 각 단계에서 콜론으로 분리해 지시와 지속 시간(초)을 추출합니다.
strconv패키지를 사용해 지속 시간 문자열을 정수로 변환합니다.- 두 번째 입력을 정수로 변환해 사이클 수를 가져옵니다.
- 세션 헤더를 표시합니다:
"=== MEDITATION TIMER ===" - 세션 설정을 표시합니다:
"Starting meditation session with [number_of_cycles] cycles" - 각 사이클에 대해(사이클 1부터 시작):
- 다음을 표시합니다:
"--- Cycle [cycle_number] ---" - 각 명상 단계에 대해:
- 다음을 표시합니다:
"[instruction]..." time.Sleep을 사용해 지정된 시간 동안 멈춥니다(검사가 빠르게 끝나도록 지속 시간에time.Millisecond를 곱합니다. 예:time.Duration(duration) * 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 컴파일러