Senior
Задача: «Пинг-понг с таймаут» Напишете функция pingPong, която: - Стартира две горутини: едната генерира съобщения "ping", другата — "pong". - Горутините трябва да обменят съобщения чрез общ канал строго по ред. - Обменът продължава 3 секунди, след което програмата трябва да приключи (грейсфул спиране). - Използвайте контекст за анулиране с таймаут. - Извеждайте всяко съобщение на екрана заедно с времето (в милисекунди от старта). Примерен очакван изход: 0ms: ping
sobes.tech AI
Отговор от AI
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()
// Функция за показване с време от старта
printMsg := func(msg string) {
elapsed := time.Since(start).Milliseconds()
fmt.Printf("%dms: %s\n", elapsed, msg)
}
// Горутина ping
go func() {
for {
select {
case <-ctx.Done():
return
case ch <- "ping":
}
}
}()
// Горутина pong
go func() {
for {
select {
case <-ctx.Done():
return
case msg := <-ch:
printMsg(msg)
if msg == "ping" {
ch <- "pong"
}
}
}
}()
// Главната горутина чете pong и показва
for {
select {
case <-ctx.Done():
return
case msg := <-ch:
printMsg(msg)
}
}
}
func main() { pingPong() }
В това решение две горутини обменят съобщения чрез канал `ch`. Горутина `ping` изпраща "ping", горутина `pong` чете "ping", показва и изпраща "pong" обратно. Главната горутина чете "pong" и показва. Контекстът с таймаут 3 секунди осигурява подредено затваряне.