Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Rehberli 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:

  1. Tek tek meditasyon adımlarını elde etmek için ilk girdiyi virgüllere göre bölün
  2. Her adım için talimatı ve süreyi (saniye cinsinden) çıkarmak üzere iki nokta üst üste işaretlerine göre bölün
  3. Süre dizelerini strconv paketini kullanarak tam sayılara dönüştürün
  4. Döngü sayısını elde etmek için ikinci girdiyi bir tam sayıya dönüştürün
  5. Oturum başlığını görüntüleyin: "=== MEDITATION TIMER ==="
  6. Oturum kurulumunu görüntüleyin: "Starting meditation session with [number_of_cycles] cycles"
  7. 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.Sleep kullanın (süreyi time.Millisecond ile çarpın; örneğin time.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)"
    • Bir döngüdeki tüm adımlar tamamlandıktan sonra şunu görüntüleyin: "Cycle [cycle_number] finished"
  8. 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)
  9. 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
	
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Go derleyicisi