Sobes.tech

Golang

Compito: «Ping-pong con timeout» Scrivi una funzione pingPong che: - Avvia due goroutine: una genera messaggi "ping", l'altra — "pong". - Le goroutine devono scambiarsi messaggi attraverso un canale comune rigorosamente a turno. - Lo scambio dura 3 secondi, dopodiché il programma deve terminare (shutdown ordinato). - Usa un contesto per cancellare con timeout. - Visualizza ogni messaggio sullo schermo insieme al tempo (in millisecondi dall'inizio). Esempio di output atteso: 0ms: ping

220

Compito semplice di live coding (concorrente di base) Condizione: Scrivi una funzione fetchAll(urls []string) map[string]string, che per ogni URL esegue una richiesta HTTP GET in modo concorrente e restituisce una mappa in cui la chiave è l'URL e il valore è il corpo della risposta (stringa). Se la richiesta fallisce (errore, non 200), il valore sarà una stringa vuota. Restrizioni: - Non usare librerie esterne (solo quelle standard). - Non modificare la firma. - Il programma non deve fallire in caso di panic in http.Get. Esempio di input: ["[link]" "[link]" "[link]"]

203

pacchetto main import ( "fmt" ) func a(p *string) { s2 := "string2" *p = s2 } func main() { str1 := "string1" p := &str1 fmt.Println(*p) a(&p) fmt.Println(*p) }

193

Riempire lo slice con elementi senza mutex in modo che contenga tutti e 1000 gli elementi.

182

Cosa dire all'intervistatore (se chiedono) "Userei un pool di worker con un numero fisso di worker, un canale per i compiti e sync.WaitGroup. I worker eseguiranno le richieste, e timeout e cancellazione saranno controllati tramite il contesto. Raccoglierò i risultati in un buffer, protetto da un mutex (o tramite un canale separato)." Ora tocca a te Scrivi il codice in questa chat. Lo controllerò e ti darò feedback. Se non sai da dove cominciare, chiedi un suggerimento. Buona fortuna!

177

// tutti gli elementi dello slice devono essere unici + devono consistere in 1000 elementi in totale // il programma non deve bloccarsi troppo a causa di time.sleep func main() { checkIncrement := map[int]int32{} var data []int for i := 0; i < 1000; i++ { go func() { data = append(data, i) if _, found := checkIncrement[i]; found { fmt.Println(i) panic("incremento duplicato") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }

167

Cos'è un puntatore e cosa succede se l'argomento di una funzione è un puntatore?

161