Tidur dan Ticker
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 64 dari 68.
Terkadang kamu perlu mengatur waktu eksekusi programmu. Go menyediakan dua fungsi penting dalam package time untuk keperluan ini: time.Sleep untuk menjeda eksekusi dan time.NewTicker untuk melakukan tindakan secara berkala.
Fungsi time.Sleep menjeda programmu selama durasi yang ditentukan. Fungsi ini menerima time.Duration sebagai parameternya dan memblokir eksekusi hingga durasi tersebut berlalu:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")Untuk tindakan berulang dengan interval tetap, time.NewTicker membuat ticker yang mengirim nilai melalui channel pada interval yang ditentukan. Ini berguna untuk tugas yang perlu dijalankan secara berkala:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Tunggu tick berikutnya
fmt.Println("Tick", i+1)
}Fungsi pengaturan waktu ini penting untuk membuat jeda, menerapkan batas waktu, dan menjadwalkan operasi berulang dalam program Go-mu.
Tantangan
MudahBuat timer sesi meditasi yang menggunakan time.Sleep untuk membuat jeda di antara instruksi terpandu dan menunjukkan kontrol waktu dasar dalam program Go.
Kamu akan menerima dua input:
- Sebuah string yang berisi langkah-langkah meditasi dengan format
"step1:duration,step2:duration,step3:duration"(misalnya,"Breathe in:3,Hold:2,Breathe out:4") - Sebuah string yang berisi jumlah siklus untuk diulang (misalnya,
"5")
Tugasmu adalah:
- Uraikan input pertama dengan memisahkan berdasarkan koma untuk mendapatkan setiap langkah meditasi
- Untuk setiap langkah, pisahkan berdasarkan titik dua untuk mengambil instruksi dan durasi (dalam detik)
- Ubah string durasi menjadi integer menggunakan package
strconv - Ubah input kedua menjadi integer untuk mendapatkan jumlah siklus
- Tampilkan header sesi:
"=== MEDITATION TIMER ===" - Tampilkan penyiapan sesi:
"Starting meditation session with [number_of_cycles] cycles" - Untuk setiap siklus (dimulai dari siklus 1):
- Tampilkan:
"--- Cycle [cycle_number] ---" - Untuk setiap langkah meditasi:
- Tampilkan:
"[instruction]..." - Gunakan
time.Sleepuntuk jeda selama durasi yang ditentukan (kalikan durasi dengantime.Millisecond, seperti padatime.Duration(duration) * time.Millisecond, agar pemeriksaan selesai dengan cepat; output tetap menyebutkan detik) - Setelah jeda, tampilkan:
"[instruction] complete ([duration] seconds)"
- Tampilkan:
- Setelah menyelesaikan semua langkah dalam satu siklus, tampilkan:
"Cycle [cycle_number] finished"
- Tampilkan:
- Setelah semua siklus selesai, tampilkan ringkasan sesi:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(jumlah durasi semua langkah dikalikan dengan jumlah siklus)
- Tampilkan pesan penyelesaian:
"Meditation session finished - well done!"
Gunakan package time untuk operasi jeda, package strings untuk memisahkan string input, package strconv untuk mengubah string menjadi integer, dan package fmt untuk output. Ingat bahwa time.Sleep menerima parameter time.Duration, jadi ubah integer terlebih dahulu: time.Duration(duration) * time.Millisecond. Timer sungguhan akan menggunakan time.Second, tetapi jeda dalam hitungan detik penuh membuat pemeriksaan kehabisan waktu. Tantangan ini menunjukkan cara menggunakan time.Sleep untuk membuat jeda terukur dalam eksekusi program, untuk penerapan praktis seperti meditasi terpandu atau timer olahraga.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Baca input dengan bufio.Scanner agar spasi tertangani dengan benar
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Uraikan langkah-langkah meditasi dan jumlah siklus
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Tulis kodemu di bawah ini
// Uraikan setiap langkah untuk mengambil instruksi dan durasinya
// Pastikan slice parts memiliki cukup elemen sebelum kamu mengaksesnya
// Tampilkan judul sesi dan pengaturannya
// Ulangi setiap siklus dan langkah
// Gunakan time.Sleep untuk jeda: time.Duration(duration) * time.Millisecond
// Tampilkan pesan penyelesaian dan ringkasan
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas7Penanganan Error secara Mendalam
Tipe Error KustomMembungkus Error dengan `%w`Membuka Bungkus Error dengan `errors.Is`Membuka Bungkus Error dengan `errors.As`Memahami `panic`Menggunakan `recover`Rangkuman: Pembagian Aman10Bekerja dengan Waktu
Mendapatkan Waktu Saat IniMembuat Waktu TertentuMemformat WaktuMengurai String WaktuDurasi WaktuAritmetika WaktuTidur dan TickerRekap: Timer Sederhana2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online