// πρόσθεσε $1
Golang
Αν έγραφες εσύ μονάδες δοκιμών για τον κώδικά σου, ποιες θα έγραφες; Ποια άκρα περιπτώσεις θα ελέγχατε;
Από πού να πάρετε το ID του συμβάντος για την ιδιομορφία και πού να το δημιουργήσετε;
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount partner.Hold -= amount partner.Balance += amount if err := r.save(advertiser); err != nil { return err } if err := r.save(partner); err != nil { return err } r.totalPayouts++ return nil }
Πώς καταλαβαίνουμε σε επίπεδο SQL ότι ήδη υπάρχει ένα κλειδί ιδιομορφίας; Πώς χρησιμοποιούμε το ON CONFLICT;
Πού αποθηκεύσατε τα αρχεία καταγραφής, ποιο πακέτο καταγραφής χρησιμοποιήσατε στον κώδικα και πώς τα αρχεία καταγραφής από το stdout πήγαν στο Elasticsearch;
Πες μου για το έργο/θέση εργασίας: τεχνολογική στοίβα, καθήκοντα της ομάδας
Τι θα συμβεί με το ID στο outbox αν η συναλλαγή δεν ολοκληρωθεί;
Ποια άλλα παγκόσμια προβλήματα υπάρχουν στον κώδικα; Πώς αποθηκεύουμε χρήματα — μπορούμε να χρησιμοποιήσουμε float;
Ποιο είναι το πρόβλημα με το να αντιγράφεις το sql.DB κατά τιμή αντί για δείκτη;
func (r *PayoutRepository) save(p Partner) error { _, err := r.db.Exec( fmt.Sprintf("UPDATE partners SET balance = %s, hold = %s WHERE id = %s", p.Balance, p.Hold, p.ID), ) if err != nil { return err } if err := r.eventPublisher.Publish("BalanceChanged", p); err != nil { return err } return nil }
Πόσο καιρό διατηρούνταν τα αρχεία καταγραφής και πόσο καιρό διατηρούνταν τα δεδομένα στο Kafka;
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // προσθέστε μια συναλλαγή if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount partner.Hold -= amount partner.Balance += amount if err := r.save(advertiser); err != nil { return err } if err := r.save(partner); err != nil { return err } r.totalPayouts++ return nil } func (r *PayoutRepository) find(id string) (Partner, error) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) // προσθέστε $1 if err != nil { if err == sql.ErrNoRows { return p, errors.New("συνεργάτης όχι βρέθηκε") } return p, err } return p, nil }
func (p *Pool) Stop() { p.mu.Unlock() // Τώρα είναι ασφαλές να κλείσουμε το κανάλι close(p.tasks) // σήμα στους εργαζόμενους: δεν θα υπάρχουν νέες εργασίες, διαβάστε το υπόλοιπο p.wg.Wait() // περιμένουμε να ολοκληρωθούν όλα τα goroutines p.cancel() // ακυρώνουμε το πλαίσιο, αν χρειάζεται fmt.Println("Pool σταμάτησε.") } // ForceStop αναγκαστικά σταματά όλους τους εργαζόμενους χωρίς να περιμένει την ολοκλήρωση των εργασιών. // Οι εργαζόμενοι θα διακοπούν αμέσως μέσω του πλαισίου. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Αναγκαστική διακοπή του pool (timeout: %v)...\n", timeout) // Μπλοκάρει την προσθήκη νέων εργασιών p.mu.Lock() p.isOpen = false p.mu.Unlock() // Κλείνει το κανάλι ώστε οι εργαζόμενοι να μην πάρουν νέες εργασίες close(p.tasks) // Ακυρώνουμε το πλαίσιο – αυτό θα διακόψει όλες τις τρέχουσες εργασίες p.cancel() // Δίνουμε περιορισμένο χρόνο για να ολοκληρωθούν done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool αναγκαστικά σταμάτησε (όλοι οι εργαζόμενοι τερματίστηκαν)") case <-time.After(timeout): fmt.Println("Pool αναγκαστικά σταμάτησε (timeout, ενδέχεται να παραμείνουν goroutines σε αναμονή)") } }
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // προσθήκη συναλλαγής if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // προστασία SELECT FOR UPDATE partner.Hold -= amount partner.Balance += amount if err := r.save(advertiser); err != nil { return err } if err := r.save(partner); err != nil { return err } r.totalPayouts++ return nil }
Αποσπάστε την ερώτηση/εργασία της συνέντευξης από αυτό το στιγμιότυπο οθόνης. Διατηρήστε τη γλώσσα του πρωτοτύπου.
/* Μια ταξινομημένη σε μη φθίνουσα λίστα ακέραιων αριθμών a, ένα δείκτη index και ένας ακέραιος αριθμός k. Πρέπει να επιστρέψετε σε οποιαδήποτε σειρά k αριθμούς από τη λίστα που είναι οι πιο κοντινοί σε τιμή με το στοιχείο a[index]. a=[2, 3, 5, 7, 11], index=3, k=2 -> [5, 7] a=[4, 12, 15, 15, 24], index=1, k=3 -> [12, 15, 15] a=[2, 3, 5, 7, 11], index=2, k=2 -> [3, 5] ή [5, 7] */
Τι είναι τα ld, rd := 1<<62, 1<<62 στο πλαίσιο του αλγορίθμου;
Τι ακριβώς να γράψετε στο μήνυμα Kafka; Ποια πεδία να μεταδώσετε στους καταναλωτές;
Δίνεται μια ταξινομημένη σε μη φθίνουσα σειρά λίστα ακέραιων αριθμών a, μια θέση στοιχείου index και ένας ακέραιος k. Πρέπει να επιστρέψετε σε οποιαδήποτε σειρά k αριθμούς από τη λίστα, που είναι οι πιο κοντινοί σε τιμή στο στοιχείο a[index]. a=[2, 3, 5, 7, 11], index=3, k=2 -> [5, 7] a=[4, 12, 15, 15, 24], index=1, k=3 -> [12, 15, 15] a=[2, 3, 5, 7, 11], index=2, k=2 -> [3, 5] ή [5, 7]