Sobes.tech
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.