Uyutma ve Ticker'lar
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 64 / 68.
Bazen programınızın çalışmasının zamanlamasını kontrol etmeniz gerekir. Go, bunun için time paketinde iki temel işlev sunar: çalışmayı duraklatmak için time.Sleep ve düzenli aralıklarla işlem gerçekleştirmek için time.NewTicker.
time.Sleep işlevi, programınızı belirtilen bir süre boyunca duraklatır. Parametre olarak bir time.Duration alır ve bu süre geçene kadar yürütmeyi engeller:
fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")Düzenli aralıklarla tekrarlanan eylemler için time.NewTicker, belirtilen aralıklarla bir kanala değerler gönderen bir ticker oluşturur. Bu, periyodik olarak çalışması gereken görevler için kullanışlıdır:
ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
<-ticker.C // Bir sonraki tik'i bekle
fmt.Println("Tick", i+1)
}Bu zamanlama işlevleri, Go programlarınızda gecikmeler oluşturmak, zaman aşımlarını uygulamak ve yinelenen işlemleri zamanlamak için gereklidir.
Görev
KolayRehberli talimatlar arasında duraklamalar oluşturmak ve Go programlarındaki temel zamanlama denetimini göstermek için time.Sleep kullanan bir meditasyon oturumu zamanlayıcısı oluşturun.
İki girdi alacaksınız:
"step1:duration,step2:duration,step3:duration"biçiminde meditasyon adımlarını içeren bir dize (ör."Breathe in:3,Hold:2,Breathe out:4")- Tekrarlanacak döngü sayısını içeren bir dize (ör.
"5")
Göreviniz:
- Tek tek meditasyon adımlarını elde etmek için ilk girdiyi virgüllere göre bölün
- Her adım için talimatı ve süreyi (saniye cinsinden) çıkarmak üzere iki nokta üst üste işaretlerine göre bölün
- Süre dizelerini
strconvpaketini kullanarak tam sayılara dönüştürün - Döngü sayısını elde etmek için ikinci girdiyi bir tam sayıya dönüştürün
- Oturum başlığını görüntüleyin:
"=== MEDITATION TIMER ===" - Oturum kurulumunu görüntüleyin:
"Starting meditation session with [number_of_cycles] cycles" - Her döngü için (1. döngüden başlayarak):
- Şunu görüntüleyin:
"--- Cycle [cycle_number] ---" - Her meditasyon adımı için:
- Şunu görüntüleyin:
"[instruction]..." - Belirtilen süre boyunca beklemek için
time.Sleepkullanın (süreyitime.Millisecondile çarpın; örneğintime.Duration(duration) * time.Millisecondşeklinde; böylece kontroller hızla tamamlanır, ancak çıktı yine saniye belirtir) - Beklemenin ardından şunu görüntüleyin:
"[instruction] complete ([duration] seconds)"
- Şunu görüntüleyin:
- Bir döngüdeki tüm adımlar tamamlandıktan sonra şunu görüntüleyin:
"Cycle [cycle_number] finished"
- Şunu görüntüleyin:
- Tüm döngüler tamamlandıktan sonra oturum özetini görüntüleyin:
"=== SESSION COMPLETE ===""Total cycles completed: [number_of_cycles]""Steps per cycle: [number_of_steps]""Total meditation time: [total_seconds] seconds"(tüm adımların sürelerinin toplamı, döngü sayısıyla çarpılır)
- Tamamlanma mesajını görüntüleyin:
"Meditation session finished - well done!"
Bekleme işlemleri için time paketini, girdi dizelerini bölmek için strings paketini, dizeleri tam sayılara dönüştürmek için strconv paketini ve çıktı için fmt paketini kullanın. time.Sleep işlevinin time.Duration türünde bir parametre aldığını unutmayın; bu nedenle önce tam sayıyı dönüştürün: time.Duration(duration) * time.Millisecond. Gerçek bir zamanlayıcı time.Second kullanırdı, ancak tam saniyelik beklemeler kontrollerin zaman aşımına uğramasına neden olur. Bu görev, rehberli meditasyon veya egzersiz zamanlayıcıları gibi pratik uygulamalarda program yürütülürken zamanlanmış duraklamalar oluşturmak için time.Sleep işlevinin nasıl kullanılacağını gösterir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Boşlukları doğru şekilde işlemek için girdiyi bufio.Scanner kullanarak oku
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
stepsInput := scanner.Text()
scanner.Scan()
cyclesInput := scanner.Text()
// Meditasyon adımlarını ve döngü sayılarını ayrıştır
steps := strings.Split(stepsInput, ",")
cycles, _ := strconv.Atoi(cyclesInput)
// TODO: Kodunu aşağıya yaz
// Talimatı ve süreyi elde etmek için her adımı ayrıştır
// Erişmeden önce parts diliminde yeterli sayıda öğe olup olmadığını kontrol etmeyi unutma
// Oturum başlığını ve hazırlık bilgilerini göster
// Döngüler ve adımlar arasında dolaş
// Duraklamalar için time.Sleep kullan: time.Duration(duration) * time.Millisecond
// Tamamlanma mesajlarını ve özeti göster
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme7Derinlemesine Hata Yönetimi
Özel Hata Türleri`%w` ile Hataları Sarmalama`errors.Is` ile Sarmalı Açma`errors.As` ile Sarmalı Açma`panic` Kavramını Anlamak`recover` KullanımıÖzet - Güvenli Bölme10Zamanla Çalışmak
Şu Anki Zamanı AlmaBelirli Bir Zaman OluşturmaZamanı FormatlamaZaman Dizelerini AyrıştırmaZaman SüresiZaman AritmetiğiUyutma ve Ticker'larÖzet - Basit Zamanlayıcı2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve DavranışlarKendi başına pratik yap: Online Go derleyicisi