Golang
Kto wchodzi do zespołu pod względem wielkości?
Co jest Ci bliższe — rozwój produktu czy infrastruktury?
Jak bardzo aktywne jest obecnie poszukiwanie? Czy już zamierzacie odejść z [firma], czy na razie tylko przyglądacie się interesującym ofertom?
Aktualizacje dokumentów trafiają do usługi message Document { string Url = 1; // URL dokumentu, jego unikalny identyfikator uint64 PubDate = 2; // deklarowany czas publikacji dokumentu uint64 FetchTime = 3; // czas otrzymania tej aktualizacji dokumentu, może być traktowany jako identyfikator wersji. Para (Url, FetchTime) jest unikalna. string Text = 4; // tekst dokumentu uint64 FirstFetchTime = 5; // początkowo nieobecne, musi zostać uzupełnione } Dokumenty mogą docierać w dowolnej kolejności (nie w kolejności, w jakiej były aktualizowane), mogą też występować duplikaty wiadomości. Wynikiem na wyjściu jest konieczność utworzenia takich samych wiadomości, ale z poprawionymi polami zgodnie z następującymi zasadami (wszystko poniżej dotyczy grupy dokumentów z tym samym polem Url): Pole Text i FetchTime powinny być takie, jak w dokumencie z największym FetchTime, otrzymanym do tej pory. Pole PubDate powinno być takie, jak w wiadomości z najmniejszym FetchTime. Pole FirstFetchTime powinno być równe minimalnej wartości FetchTime. Inaczej mówiąc, w każdym momencie bierzemy PubDate i FirstFetchTime z pierwszej wersji otrzymanej do tej pory (jeśli posortujemy je według FetchTime), a Text z ostatniej. Interfejs w kodzie można zaimplementować tak: type Processor interface { Process(doc *Document) (*Document, error) } Ten kod będzie działał w serwisie, który odczytuje wiadomości z kolejki (Kafka lub podobnej), i zapisuje wynik również do kolejki. Jeśli Process zwraca Null, nic nie jest zapisywane do kolejki.
Czy pprof zawsze pokaże wyciek pamięci lub przekroczenie limitu?
Opowiedz krótko, czym zajmowałeś się w poprzednich miejscach pracy i jakie funkcje zaimplementowałeś.
Zaimplementuj funkcję, która przyjmuje []any i delta int. Należy zwiększyć o delta tylko pierwsze wystąpienia unikalnych liczb (int). Inne typy i powtarzające się liczby pozostawić bez zmian. Funkcja powinna zwrócić zaktualizowaną listę i 2 liczby: updated – ile unikalnych liczb zostało zmienionych, duplicates – ile elementów liczbowych okazało się duplikatami func IncrementUniqueIntsInMixed(xs []any, delta int) ([]any, int, int) { // twój kod } // Przykład: xs := []any{1, "a", 5, "b", 1, 0, 5} u, d, s := IncrementUniqueIntsInMixed(xs, 3) // xs == []any{4, "a", 8, "b", 1, 3, 5} // u == 3 // unikalne liczby: 1, 5, 0 // d == 2 // duplikaty: drugi 1, drugi 5
Czy masz doświadczenie w pracy z Dockerem i Kubernetes? Na jakim poziomie?
Opowiedz o wzorcu Transactional Outbox — jak on działa i do czego służy?
Czy masz doświadczenie w optymalizacji zapytań w relacyjnych bazach danych?
Jakie są Twoje oczekiwania finansowe i preferowany format prezentacji?
Ile goroutine można utworzyć na jednym komputerze? Jak to obliczyć?
Jak zoptymalizowałeś skrypty wyszukiwania?
// Mamy metodę do pobierania informacji o produktach, ta metoda jest wywoływana bardzo często // czy są problemy w tym kodzie i jak je naprawić? baza danych postgress func (r *ProductRepository) GetProductDetails(ctx context.Context, productIDs []int) []Product { products := make([]Product, 0, len(productIDs)) for _, id := range productIDs { go func(id int) { var p Product query := "SELECT name, price, description FROM products WHERE id = $1" err := r.db.QueryRowContext(ctx, query, id).Scan(&p.Name, &p.Price, &p.Desc) if err != nil { r.logger.Error("error get product", "err", err) return } products = append(products, p) }(id) } return products }
**Warunek** Zapytania do wielu adresów URL powinny być wykonywane równolegle. Należy wyświetlić statusy HTTP i obsłużyć błędy.
Dlaczego wybrałeś Go dla siebie?
Jakie systemy konteneryzacji i orkiestracji znasz?
Jak często korzystałeś z triggerów, tylko w przypadku z historią czy były też inne przypadki?
Czym jest stos i czym jest sterta?
Jakie frameworki, standardy i pakiety używasz w Go?