Перейти к содержимому

Eapteka / Еаптека (Сбер Еаптека)

  • что такое слайс, а массив? как связаны, особенности аппенда go/slices-arrays
  • что будет если писать в закрытый канал или читать из него, а канал nil? go/channels
  • что такое сервис меш architecture/microservices
  • что такое дата рейс, а просто рейс? go/concurrency
  • как синхронизировать горутины go/concurrency
  • кафка - 1 партишн и 3 консьюмера, 3 партишена - 1 консьюмер brokers/kafka
  • cap/pacelc теоремы architecture/general
  • какие паттерны микросервисов знаешь? architecture/microservices
  • как ускорить запросы в sql (индексы и view) sql/indexes
  • Что выведется на экран и почему? go/puzzles
func main() {
nums := []int{1, 2, 3}
addNum(nums[0:2])
fmt.Println(nums)
addNums(nums[0:2])
fmt.Println(nums)
}
func addNum(nums []int) {
nums = append(nums, 4)
}
func addNums(nums []int) {
nums = append(nums, 5, 6)
}
  • Что выведется на экран и почему? go/puzzles
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
worker(i)
}()
}
wg.Wait()
fmt.Println("Jobs done ")
}
func worker(id int) {
fmt.Printf("Worker %d starting\n ", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n ", id)
}
  • Что выведется на экран и почему? go/puzzles
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
fmt.Println("writing finished ")
}()
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("reading finished ")
}()
time.Sleep(2 * time.Second)
fmt.Println("end main ")
}
  • Реализовать in-memory кэш менеджер для хранения пользователей go/memory-gc
// Функциональные требования:
// - добавление юзера по ключу с указанием времени хранения
// - получение юзера по ключу
// - удаление юзера по ключу
// - удаление юзера по истечении времени хранения
// - учесть параллельную работу с кэшем
type User struct {
UUID string
Name string
Age int
}
func main() {
// person := User{
// UUID: "ada8012f-21b7-4e53-84f3-3f8975a0f215 ",
// Name: "Alex ",
// Age: 20,
// }
//
// storage.Set(person.UUID, person, 10*time.Second)
// storage.Get(person.UUID)
// storage.Delete(person.UUID)
}
type RateLimiter struct {
// TODO
}
func NewRateLimiter(limit int) *RateLimiter {
// TODO
}
func (rl *RateLimiter) Process(f func()) error {
// TODO
}
func main() {
rl := NewRateLimiter(10)
http.HandleFunc("/request ", func(w http.ResponseWriter, r *http.Request) {
err := rl.Process(func() {})
if err != nil {
w.WriteHeader(http.StatusTooManyRequests)
w.Write([]byte("Too many requests "))
}
})
http.ListenAndServe(":8080 ", nil)
}
  • Реализовать worker pool для параллельной обработки запросов к различным ресурсам go/concurrency
// Функциональные требования
// - добавление задач для воркера
// - получение результатов обработки задачи (url, httpCode, error)
func main() {
// urls := []string{
// "https://mail.ru/",
// "https://yandex.ru/",
// //...
// }
}
  • Реализовать фильтрацию продуктов по цене и заголовку наиболее быстрым способом network/http
type (
product struct {
title string
price int
}
filters struct {
priceMin int
priceMax int
title string
}
)
func main() {
products := []product{
{
title: "Ингавирин ",
price: 900,
},
{
title: "Нурофен Форте ",
price: 500,
},
{
title: "Аспирин ",
price: 1000,
},
{
title: "Нурофен Экспресс ",
price: 1100,
},
{
title: "Нурофен Интенсив ",
price: 900,
},
}
fl := filters{
priceMin: 400,
priceMax: 1000,
title: "Нурофен ",
}
broker.Produce(filter(products, fl))
// {
// title: "Нурофен Форте ",
// price: 500,
// },
//
// {
// title: "Нурофен Интенсив ",
// price: 900,
// },
}
// TODO implement it
func filter(products []product, fl filters) <-chan product {
// TODO
}