Разкажи повече за проекта в Авито — това беше единственият проект за три години?
Golang
func (c *Client) Send(ctx context.Context, messages []Message, maxWorkers int) error { sem := make(chan struct{}, maxWorkers) var wg sync.WaitGroup var resultErr error var once sync.Once for _, msg := range messages { wg.Add(1) go func(msg Message) { defer wg.Done() sem <- struct{}{} defer func() { <-sem }() body, err := json.Marshal(msg) if err != nil { once.Do(func() { resultErr = err; cancel() }) return } req, _ := http.NewRequestWithContext( ctx, http.MethodPost, c.url, bytes.NewReader(body), ) req.Header.Set("Content-Type", "application/json") resp, err := c.httpClient.Do(req) if err != nil { once.Do(func() { resultErr = err; cancel()}) return } defer resp.Body.Close() if resp.StatusCode >= 500 { once.Do(func() { resultErr = fmt.Errorf("server error") cancel()}) return } c.sentCount.Add(1) time.Sleep(time.Second) }(msg) } wg.Wait() }
Какъв тип е msg в горутината и защо трябва да го предавате като аргумент?
Защо resultErr не се връща директно от горутината?
Имате ли договорки с други работодатели или все още преминавате етапите на интервюта?
Къде трябва да се направи defer resp.Body.Close()?
/* На разработчика беше възложена задачата да напише услуга за изпращане на известия. Изисквания: - Методът Send трябва да изпраща съобщения паралелно. - Не трябва да се изпълняват повече от maxworkers HTTP заявки едновременно. - Ако поне една изпращане се провали, останалите трябва да бъдат спряни и да се върне грешка. - Методът трябва правилно да обработва анулирането на контекста. - Всички ресурси трябва да бъдат правилно освободени. - Методът може да бъде извикван конкурентно от различни goroutines. - Client трябва да поддържа броя на успешно изпратените съобщения. Трябва да се направи преглед на кода, да се намерят проблеми и да се коригира кодът.
Какъв е вашият общ търговски опит в разработката с Go?
Ще бъде ли удобно да работите с техническа документация на английски език?
Разкажи ми за ВсичкиИнструменти — защо дойде и защо си тръгнал?
Какъв опит имаш с SQL? Можеш ли да пишеш и оптимизираш заявки?
Къде завършват контекстите в този код?
Какви са бързите игри?
sentCount се предава без синхронизация — как да го поправим?
Какво търсиш в нов проект? Какви технологии те интересуват? Какво не би искал да виждаш на новото работно място?
Какво ще стане, ако не предадете контекста в заявката към базата данни?
Кога индексът не помага или дори вреди?
Какви етапи (stages) обикновено има в CI/CD pipeline за Go услуга?