Sobes.tech

Golang

Əgər sən öz kodun üçün vahid testlər yazsaydın, hansılarını yazardın? Hansı kənar halları yoxlayardın?

Senior
294

İdempotenslik üçün hadisə ID-sini haradan almaq və onu harada yaratmaq olar?

Senior
198

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
192

SQL səviyyəsində artıq belə bir idempotentlik açarının olduğunu necə başa düşmək olar? ON CONFLICT necə istifadə olunur?

Senior
184

Logları harada saxlamısınız, kodda hansı loglama paketindən istifadə etdiniz və loglar stdout-dan Elasticsearch-ə necə keçdi?

Senior
175

Layihə/vəzifə haqqında danışın: texnologiyalar yığını, komanda tapşırıqları

Senior
167

Kodda başqa hansı qlobal problemlər var? Pul necə saxlamaq olar — float istifadə etmək mümkündürmü?

Senior
156

Əgər əməliyyat təsdiqlənməzsə, outbox-dakı ID ilə nə baş verəcək?

Senior
152

func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // əməliyyat əlavə et if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // SELECT FOR UPDATE qoruma 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
149

sql.DB-nin dəyər kimi kopyalanmasının problemi nədir, göstərici ilə deyil?

Senior
136

Girişlər nə qədər müddət saxlanılıb və Kafka-da məlumatlar nə qədər müddət saxlanılıb?

Senior
132

func (p *Pool) Stop() { p.mu.Unlock() // İndi kanal təhlükəsiz şəkildə bağlana bilər close(p.tasks) // işçilərə siqnal: yeni tapşırıq olmayacaq, qalanını oxu p.wg.Wait() // bütün gorutinaların tamamlanmasını gözləyirik p.cancel() // ehtiyat üçün konteksti ləğv et fmt.Println("Pool dayandırıldı.") } // ForceStop bütün işçiləri tapşırıqlar tamamlanmadan zorla dayandırır. // İşçilər dərhal kontekst vasitəsilə kəsiləcək. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Pool-u zorla dayandırma (zaman aşımı: %v)...\n", timeout) // Yeni tapşırıqların əlavə olunmasını bloklayır p.mu.Lock() p.isOpen = false p.mu.Unlock() // Kanalı bağlayır ki, işçilər yeni tapşırıq götürməsin close(p.tasks) // Konteksti ləğv et – bu, bütün yerinə yetirilən tapşırıqları kəsəcək p.cancel() // Tamamlama üçün məhdud vaxt verilir done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool zorla dayandırıldı (bütün işçilər tamamlandı)") case <-time.After(timeout): fmt.Println("Pool zorla dayandırıldı (zaman aşımı, asılı qalan gorutinalar qala bilər)") } }

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) // tranzaksiya əlavə et 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 əlavə et if err != nil { if err == sql.ErrNoRows { return p, errors.New("həmkar tapılmadı") } return p, err } return p, nil }

Senior
125

Bu ekran görüntüsündən müsahibə sualını/vəzifəsini çıxarın. Orijinal dili saxlayın.

Senior
123

/* Sıralanmış artan sırayla tam ədədlər siyahısı a, indeks index və tam ədəd k verilir. Siyahıdan a[index] elementinə ən yaxın olan k ədədi istənilən qaydada geri qaytarın. 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] və ya [5, 7] */

Senior
114

Kafka mesajında dəqiq nə yazılmalı? İstehlakçılara hansı sahələri ötürmək lazımdır?

Senior
108

Algoritmin kontekstində ld, rd := 1<<62, 1<<62 nədir?

Senior
107

saxlama paketi 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
93
/2