Senior
Feladat: «Timeout-tal ellátott ping-pong» Írjon egy pingPong nevű függvényt, amely: - Két goroutine-t indít: az egyik "ping" üzeneteket generál, a másik — "pong". - A goroutine-oknak szigorúan egymás után kell üzeneteket cserélniük egy közös csatornán keresztül. - A csere 3 másodpercig tart, ezután a programnak be kell fejeződnie (zökkenőmentes leállás). - Használjon kontextust az időtúllépéses leállításhoz. - Minden üzenetet írjon ki a képernyőre az indulástól számított idővel együtt (milliszekundumban). Várható kimenet például: 0ms: ping
sobes.tech MI
Válasz az MI-től
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()
// Funkció a kezdettől számított idővel való megjelenítéshez
printMsg := func(msg string) {
elapsed := time.Since(start).Milliseconds()
fmt.Printf("%dms: %s\n", elapsed, msg)
}
// Goroutine ping
go func() {
for {
select {
case <-ctx.Done():
return
case ch <- "ping":
}
}
}()
// Goroutine pong
go func() {
for {
select {
case <-ctx.Done():
return
case msg := <-ch:
printMsg(msg)
if msg == "ping" {
ch <- "pong"
}
}
}
}()
// Fő goroutine olvassa a pongot és kiírja
for {
select {
case <-ctx.Done():
return
case msg := <-ch:
printMsg(msg)
}
}
}
func main() { pingPong() }
Ebben a megoldásban két goroutine cserél üzeneteket a `ch` csatornán keresztül. A `ping` goroutine "ping"-et küld, a `pong` goroutine olvassa a "ping"-et, kiírja és visszaküldi a "pong"-ot. A fő goroutine olvassa a "pong"-ot és kiírja. A 3 másodperces időkorlát biztosítja a rendezett lezárást.