Sobes.tech
Senior

Görev: «Timeout ile ping-pong» pingPong adında bir fonksiyon yazın: - İki goroutine başlatın: biri "ping" mesajları üretir, diğeri — "pong". - Goroutine'ler, ortak bir kanal üzerinden sırayla mesaj alışverişi yapmalıdır. - Takas 3 saniye devam eder, ardından program düzgün şekilde kapanmalıdır. - Zaman aşımıyla iptal için bir bağlam kullanın. - Her mesajı ekranlara, başlangıçtan itibaren milisaniye cinsinden zamanla birlikte yazdırın. Beklenen çıktı örneği: 0ms: ping

sobes.tech yapay zeka

AI'dan gelen yanıt

go package main

import ( "context" "fmt" "time" )

func pingPong() { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel()

ch := make(chan string)
start := time.Now()

// Başlangıçtan itibaren zamanla gösterilecek fonksiyon
printMsg := func(msg string) {
	elapsed := time.Since(start).Milliseconds()
	fmt.Printf("%dms: %s\n", elapsed, msg)
}

// Ping goroutine'u
go func() {
	for {
		select {
		case <-ctx.Done():
			return
		case ch <- "ping":
		}
	}
}()

// Pong goroutine'u
go func() {
	for {
		select {
		case <-ctx.Done():
			return
		case msg := <-ch:
			printMsg(msg)
			if msg == "ping" {
				ch <- "pong"
			}
		}
	}
}()

// Ana goroutine pong'u okur ve gösterir
for {
	select {
	case <-ctx.Done():
		return
	case msg := <-ch:
		printMsg(msg)
	}
}

}

func main() { pingPong() }


Bu çözümde, iki goroutine mesajları `ch` kanalı üzerinden değiş tokuş eder. `ping` goroutine'u "ping" gönderir, `pong` goroutine'u "ping"'i okur, gösterir ve "pong" gönderir. Ana goroutine "pong"'u okur ve gösterir. 3 saniyelik zaman aşımı içeren bağlam, düzgün bir kapanış sağlar.