Senior
Тапшырма: «Timeout менен пинг-понг» 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 секунды обеспечивает graceful shutdown.