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.