Sobes.tech

Golang

Si escribieras pruebas unitarias para tu propio código, ¿cuáles escribirías? ¿Qué casos límite verificarías?

Senior
291

¿De dónde obtener el ID del evento para la idempotencia y dónde generarlo?

Senior
196

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
186

¿Cómo entender a nivel SQL que ya existe una clave de idempotencia? ¿Cómo usar ON CONFLICT?

Senior
178

¿Dónde almacenaste los registros, qué paquete de registro usaste en el código y cómo llegaron los registros desde stdout a Elasticsearch?

Senior
175

Cuéntame sobre el proyecto/oferta de trabajo: pila de tecnologías, tareas del equipo

Senior
164

¿Qué pasará con el ID en la bandeja de salida si la transacción no se confirma?

Senior
149

func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // agregar transacción if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // proteger 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
144

¿Qué otros problemas globales hay en el código? ¿Cómo almacenar dinero — se puede usar float?

Senior
144

¿Cuál es el problema de copiar sql.DB por valor en lugar de por puntero?

Senior
134

¿Cuánto tiempo se almacenaron los registros y cuánto tiempo se almacenaron los datos en Kafka?

Senior
131

func (p *Pool) Stop() { p.mu.Unlock() // Ahora se puede cerrar el canal de forma segura close(p.tasks) // señal a los workers: no habrá más tareas, lee el resto p.wg.Wait() // esperamos a que terminen todos los goroutines p.cancel() // cancelamos el contexto por si acaso fmt.Println("Pool detenido.") } // ForceStop detiene forzosamente todos los workers sin esperar a que terminen las tareas. // Los workers serán interrumpidos inmediatamente a través del contexto. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Deteniendo forzosamente el pool (timeout: %v)...\n", timeout) // Bloqueamos la adición de nuevas tareas p.mu.Lock() p.isOpen = false p.mu.Unlock() // Cerramos el canal para que los workers no tomen nuevas tareas close(p.tasks) // Cancelamos el contexto – esto interrumpirá todas las tareas en ejecución p.cancel() // Damos un tiempo limitado para finalizar done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool detenido forzosamente (todos los workers han terminado)") case <-time.After(timeout): fmt.Println("Pool detenido forzosamente (timeout, pueden quedar goroutines colgadas)") } }

Senior
129

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
129

func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // agregar transacción 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) // agregar $1 if err != nil { if err == sql.ErrNoRows { return p, errors.New("partner not found") } return p, err } return p, nil }

Senior
123

Extrae la pregunta/tarea de la entrevista de esta captura de pantalla. Mantén el idioma original.

Senior
120

/* Se da una lista ordenada no decreciente de números enteros a, un índice index y un número entero k. Debe devolver en cualquier orden k números de la lista que sean los más cercanos en valor al elemento 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] o [5, 7] */

Senior
111

¿Qué son ld, rd := 1<<62, 1<<62 en el contexto del algoritmo?

Senior
106

¿Qué exactamente escribir en el mensaje Kafka? ¿Qué campos transmitir a los consumidores?

Senior
102

paquete almacenamiento import ( "database/sql" "errors" "fmt" "time" "github.com/company/my-service/internal/event" "github.com/company/my-service/internal/metric" ) type Partner struct { ID string `db:"id" json:"id"` Balance float32 `db:"balance" json:"balance"` Hold float32 `db:"hold" json:"hold"` } type PayoutRepository struct { db sql.DB eventPublisher event.Publisher metricCollector metric.Collector totalPayouts int } func NewPayoutRepository() *PayoutRepository { db, err := sql.Open("postgres", "host=localhost user=postgres password=postgres dbname=affiliate") if err != nil { panic(err) } r := PayoutRepository{ db: db, eventPublisher: event.NewKafkaPublisher("localhost:9092"), metricCollector: metric.NewPrometheusCollector("localhost:9090"), } go func() { for range time.Tick(time.Minute) { _ = r.metricCollector.Send("TotalPayouts", r.totalPayouts) } }() return r } 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 } func (r *PayoutRepository) find(id string) (Partner, error) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) if err != nil { if err == sql.ErrNoRows { return p, errors.New("partner not found") } return p, err } return p, nil } 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
90
/2