Sobes.tech

Golang

Tâche : «Ping-pong avec timeout» Écrivez une fonction pingPong qui : - Lance deux goroutines : une génère des messages "ping", l'autre — "pong". - Les goroutines doivent échanger des messages via un canal commun strictement à tour de rôle. - L'échange continue pendant 3 secondes, puis le programme doit se terminer (arrêt gracieux). - Utilisez un contexte pour l'annulation avec un timeout. - Affichez chaque message à l'écran avec le temps (en millisecondes depuis le début). Exemple de sortie attendue : 0ms : ping

216

Tâche simple de codage en direct (concurrence de base) Condition: Écris une fonction fetchAll(urls []string) map[string]string, qui pour chaque URL effectue une requête HTTP GET de manière concurrente et retourne une carte où la clé est l'URL et la valeur est le corps de la réponse (chaîne). Si la requête échoue (erreur, pas 200), la valeur sera une chaîne vide. Restrictions: - Impossible d'utiliser des bibliothèques externes (seules les standard). - Impossible de changer la signature. - Le programme ne doit pas planter en cas de panic dans http.Get. Exemple d'entrée: ["[link]" "[link]" "[link]"]

203

package 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) }

187

Que dire à l'intervieweur (si on vous demande) "J'utiliserais un pool de workers avec un nombre fixe de workers, un canal pour les tâches et sync.WaitGroup. Les workers exécuteront les requêtes, et le timeout et l'annulation seront contrôlés via le contexte. Je rassemblerai les résultats dans un buffer, protégé par un mutex (ou via un canal séparé)." C'est à ton tour Écris le code dans cette discussion. Je vérifierai et te donnerai un retour. Si tu ne sais pas par où commencer, demande un indice. Bonne chance!

177

Remplir la tranche avec des éléments sans mutex pour qu'elle contienne tous les 1000 éléments.

174

Qu'est-ce qu'un pointeur et que se passera-t-il si l'argument d'une fonction est un pointeur?

159

// tous les éléments du slice doivent être uniques + doivent contenir 1000 éléments au total // le programme ne doit pas se bloquer longtemps à cause de 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("increment dupliqué") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }

159