Sobes.tech

Golang

Tarefa: «Ping-pong com timeout» Escreva uma função pingPong que: - Inicia duas goroutines: uma gera mensagens "ping", a outra — "pong". - As goroutines devem trocar mensagens através de um canal comum estritamente por ordem. - A troca continua por 3 segundos, após o que o programa deve terminar (desligamento gracioso). - Use um contexto para cancelar com timeout. - Mostre cada mensagem na tela junto com o tempo (em milissegundos desde o início). Exemplo de saída esperada: 0ms: ping

216

Tarefa simples de codificação ao vivo (competência básica) Condição: Escreva uma função fetchAll(urls []string) map[string]string, que para cada URL faz uma requisição HTTP GET de forma concorrente e retorna um mapa onde a chave é a URL e o valor é o corpo da resposta (string). Se a requisição falhar (erro, não 200), o valor será uma string vazia. Restrições: - Não é permitido usar bibliotecas externas (apenas as padrão). - Não é permitido alterar a assinatura. - O programa não deve falhar em caso de pânico no http.Get. Exemplo de entrada: ["[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

O que dizer ao entrevistador (se perguntarem) "Eu usaria um pool de workers com um número fixo de workers, um canal para tarefas e sync.WaitGroup. Os workers farão as requisições, e o timeout e o cancelamento serão controlados através do contexto. Reunirei os resultados em um buffer, protegido por um mutex (ou através de um canal separado)." Agora é a sua vez Escreva o código neste chat. Eu verificarei e darei feedback. Se não souber por onde começar, peça uma dica. Boa sorte!

177

Preencher o slice com elementos sem mutex para que contenha todos os 1000 elementos.

174

// todos os elementos do slice devem ser únicos + devem consistir em 1000 elementos no total // o programa não deve ficar pendurado por muito tempo devido ao 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 duplicado") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }

159

O que é um ponteiro e o que acontece se o argumento de uma função for um ponteiro?

159