Задача: «Пинг-понг с таймаутом»

go package main

Короткий ответ

Что ответить на собеседовании

go package main

Подробный разбор

Ответ с пояснениями

Условие

Задача: «Пинг-понг с таймаутом»

Напишите функцию pingPong, которая:

  • Запускает две горутины: одна генерирует сообщения "ping", другая — "pong".
  • Горутины должны обмениваться сообщениями через общий канал строго по очереди.
  • Обмен продолжается 3 секунды, после чего программа должна завершиться (graceful shutdown).
  • Используйте контекст для отмены через таймаут.
  • Выводите каждое сообщение на экран вместе с временем (в миллисекундах от старта).

Пример ожидаемого вывода:

text

0ms: ping

Ответ

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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее