Техническое собеседование
Задача 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()
// Do something with msg
storeMessageType(getMessageType(msg)) // Сохраняем последние 1000 типов сообщений в памяти
}
}
func getMessageType(msg []byte) []byte {
return msg[:5]
}
Как реализовать сохранение последних 1000 типов сообщений в памяти?
Задача 3: Работа со строками в 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
Реализовать 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()
}