1. Задача: Написать функцию, которая возвращает слайс с заданным количеством случайных уникальных чисел
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(uniqRandn(10))
}
func uniqRandn(n int) []int {
n1:=make([]int,n)
for i:=0;i<n;i++{
for{
num := rand.Int()
for j:= range n1{
c:=0
if num==j{
c++
}
}
if c!=0{
n1=append(n1,num)
break
}
}
}
return n1
}Комментарий кандидата. Было предложено улучшить реализацию через мапу.
2. Задача: Обработка сообщений и хранение истории
Дан следующий код:
package main
import "fmt"
func main() {
consumeMessages()
}
func consumeMessages() {
for {
msg := receiveMessage()
storeMessageType(getMessageType(msg))
}
}
func getMessageType(msg []byte) []byte {
return msg[:5]
}Как реализовать сохранение последних 1000 типов сообщений в памяти?
3. Как работает цикл for-range со строками в Go и каково поведение следующего кода?
package main
import "fmt"
func main() {
s := "hêllo"
for i := range s {
fmt.Printf("position %d: %cn", i, s[i])
}
fmt.Printf("len=%dn", len(s))
}4. Задача: Реализовать worker pool
Есть 10 задач, каждая засыпает на 1 секунду и выводит номер воркера. Количество воркеров задается при запуске.
package main
import "fmt"
func main() {
var wg sync.WaitGroup
n := 3
c:=make(chan struct{},n)
for i:=0;i<10;i++{
wg.Add(1)
go func(){
c<-struct{}{}
defer <-c
defer wg.Done()
time.Sleep(1*time.second)
}()
}
wg.Wait()
}Дополнительно
Кандидату было предложено улучшить первую реализацию задачи через мапу.