Sobes.tech

Golang

Si vous écriviez des tests unitaires pour votre propre code, lesquels écririez-vous ? Quels cas limites vérifieriez-vous ?

Senior
277

D'où obtenir l'ID de l'événement pour l'idempotence et où le générer?

Senior
187

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 }

Senior
181

Où avez-vous stocké les logs, quel paquet de journalisation avez-vous utilisé dans le code et comment les logs sont-ils passés de stdout à Elasticsearch?

Senior
163

Comment savoir au niveau SQL qu'une clé d'idempotence existe déjà ? Comment utiliser ON CONFLICT ?

Senior
163

Parlez-moi du projet/offre d'emploi : pile technologique, tâches de l'équipe

Senior
156

Que se passera-t-il avec l'ID dans la boîte d'envoi si la transaction n'est pas validée?

Senior
139

Quel est le problème de copier sql.DB par valeur plutôt que par pointeur?

Senior
130

Quels autres problèmes mondiaux existent dans le code ? Comment stocker de l'argent — peut-on utiliser float ?

Senior
129

Combien de temps les logs ont-ils été conservés et combien de temps les données ont-elles été conservées dans Kafka?

Senior
124

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 }

Senior
123

func (p *Pool) Stop() { p.mu.Unlock() // Maintenant, il est sûr de fermer le canal close(p.tasks) // signal aux workers : pas de nouvelles tâches, lire le reste p.wg.Wait() // attendre que toutes les goroutines se terminent p.cancel() // annuler le contexte au cas où fmt.Println("Pool arrêté.") } // ForceStop arrête de force tous les workers sans attendre la fin des tâches. // Les workers seront interrompus immédiatement via le contexte. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Arrêt forcé du pool (timeout : %v)...\n", timeout) // Bloquer l'ajout de nouvelles tâches p.mu.Lock() p.isOpen = false p.mu.Unlock() // Fermer le canal pour que les workers ne prennent pas de nouvelles tâches close(p.tasks) // Annuler le contexte – cela interrompra toutes les tâches en cours p.cancel() // Donner un temps limité pour finir done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool arrêté de force (tous les workers terminés)") case <-time.After(timeout): fmt.Println("Pool arrêté de force (timeout, des goroutines peuvent rester en suspens)") } }

Senior
119

Extraire la question/devoir d'entretien de cette capture d'écran. Conservez la langue d'origine.

Senior
117

func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // ajouter une transaction if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // protéger 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 }

Senior
116

/* Une liste triée par ordre non décroissant de nombres entiers a, un indice index et un entier k. Il faut retourner dans n'importe quel ordre k nombres de la liste qui sont les plus proches en valeur de l'élément 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] ou [5, 7] */

Senior
100

func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // ajouter une transaction 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) // ajouter $1 if err != nil { if err == sql.ErrNoRows { return p, errors.New("partenaire non trouvé") } return p, err } return p, nil }

Senior
98

Qu'est-ce que ld, rd := 1<<62, 1<<62 dans le contexte de l'algorithme?

Senior
92

Que faut-il écrire précisément dans le message Kafka ? Quels champs transmettre aux consommateurs ?

Senior
87

Une liste triée par ordre non décroissant de nombres entiers a, un indice d'élément index et un entier k. Il faut retourner dans n'importe quel ordre k nombres de la liste qui sont les plus proches en valeur de l'élément 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] ou [5, 7]

Senior
81
/2