Sobes.tech

Golang

Zadanie: «Ping-pong z timeoutem» Napisz funkcję pingPong, która: - Uruchamia dwie goroutine: jedna generuje wiadomości "ping", druga — "pong". - Goroutine muszą wymieniać się wiadomościami przez wspólny kanał ściśle na zmianę. - Wymiana trwa 3 sekundy, po czym program powinien się zakończyć (graceful shutdown). - Użyj kontekstu do anulowania z timeoutem. - Wyświetl każdą wiadomość na ekranie wraz z czasem (w milisekundach od startu). Przykład oczekiwanego wyjścia: 0ms: ping

216

Proste zadanie na live coding (podstawowa konkurencyjność) Warunek: Napisz funkcję fetchAll(urls []string) map[string]string, która dla każdego URL wykonuje równocześnie żądanie HTTP GET i zwraca mapę, gdzie kluczem jest URL, a wartością jest ciało odpowiedzi (łańcuch). Jeśli żądanie się nie powiedzie (błąd, nie 200), wartością będzie pusty łańcuch. Ograniczenia: - Nie można używać bibliotek zewnętrznych (tylko standardowe). - Nie można zmieniać sygnatury. - Program nie powinien się zawiesić przy panice w http.Get. Przykład wejścia: ["[link]" "[link]" "[link]"]

203

pakiet główny 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

Co powiedzieć rekruterowi (jeśli zapyta) "Użyłbym puli workerów z ustaloną liczbą workerów, kanału na zadania i sync.WaitGroup. Workerzy będą wykonywać zapytania, a timeout i anulowanie będą kontrolowane przez kontekst. Wyniki zbiorę w buforze, chronionym mutexem (lub przez oddzielny kanał)." Teraz twoja kolej Napisz kod w tym czacie. Sprawdzę go i dam feedback. Jeśli nie wiesz, od czego zacząć, poproś o podpowiedź. Powodzenia!

177

Wypełnij slice elementami bez mutexa, aby zawierał wszystkie 1000 elementów.

174

Czym jest wskaźnik i co się stanie, jeśli argument funkcji to wskaźnik?

159

// wszystkie elementy slice muszą być unikalne + muszą składać się łącznie z 1000 elementów // program nie powinien zawieszać się na dłużej z powodu 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("zdublowany inkrement") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }

159