Sobes.tech

Golang

pagrindinis paketas func main() { c := make(chan int, 1) per range 3 { select { numatyta: println(1) atvejis <-c: println(2) atvejis c <- 1: println(3) } } }

267

```go func fail() { panic("Nepavyko!") } func main() { fmt.Println("Pradžia!") var wg sync.WaitGroup wg.Add(1) go func() { defer func() { if e := recover(); e != nil { fmt.Println(e) } }() fail() wg.Done() }() wg.Wait() fmt.Println("Pabaiga!") } ```

221

Kodėl pasirinkote Elasticsearch? Kokios buvo kitos galimybės? Ar ką nors pasirinkote ar tiesiog jau buvo ELK?

209

Sakai, kad su Elasticsearch sukūrei įrankį greitam sandorių paieškai. Kas tai yra, kiek sandorių yra ir kokia iš to nauda?

184

func fetch(ctx context.Context, u User) (string, error) { // kažkas darome tinkle time.Sleep(time.Millisecond * 10) // vėlavimo imitacija return u.Name, nil //return "", errors.New("kita klaida") } func Do(ctx context.Context, users []User) (map[string]int64, error) { var mu sync.Mutex var wg sync.WaitGroup ch := make(chan error, len(users)) names := make(map[string]int64, 0) ctxWithCancel, cancel := context.WithCancel(ctx) wg.Add(len(users)) for _, u := range users { go func() { defer wg.Done() select { case name, err := fetch(ctx, u): if err != nil { ch <- err return } mu.Lock() names[name] = names[name] + 1 mu.Unlock() case <-ctxWithCancel.Err: } }() }

182

Po Elasticsearch diegimo ar buvo kokių nors atsiliepimų iš vartotojų ar techninės pagalbos tarnybos?

171

pagrindinis paketas importuoti ( "fmt" ) func main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Labas pasauli!" fmt.Println("Išeiti!") } mirtina klaida: visos gorutinos miega - deadlock! goroutine 1 [kanalo priėmimas]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa baigėsi: būklė 2.

158

pagrindinis paketas func main() { c := make(chan int) 3 ciklai { select { numatyta: println(1) atvejis <-c: println(2) atvejis c <- 1: println(3) } } }

157

pagrindinis paketas importuoti ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Išeiti!") }

156

Koks ryšys su paslaugomis, jei kalbame apie gedimų toleranciją ir tai sumažinome iki replikų?

149

var defaultTxOptions = &sql.TxOptions{} const defaultCurrency = "RUB" func CreateUserWithDefaultCurrency(ctx context.Context, db *sql.DB, email, passwordHash string) error { tx, err := db.BeginTx(ctx, defaultTxOptions) if err != nil { return err } defer func() { if err != nil{ tx.Rollback() } }() _, err = tx.Exec("INSERT INTO users (email, password) VALUES (?, ?)", email, passwordHash) if err != nil { return err } rows, err := tx.Query("SELECT id FROM users WHERE email = ?", email) if err != nil { return err } defer rows.Close() id := 0 for rows.Next() { err = rows.Scan(&id) if err != nil { return err } } _, err = tx.Exec("INSERT INTO balances (user_id, currency, current_balance) VALUES (?, ?, 0)", id, defaultCurrency) if err != nil { return err } return tx.Commit() }

147

pagrindinis paketas importuoti ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Labas pasauli!" fmt.Println("Išeiti!") } mirtina klaida: visi gorutinai miega - deadlock! goroutine 1 [kanalo priėmimas]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa baigėsi: būklė 2.

147

func Do(ctx context.Context, users []User) (map[string]int64, error) { var mu sync.Mutex var wg sync.WaitGroup ch := make(chan error, len(users)) names := make(map[string]int64, 0) ctxWithCancel, cancel := context.WithCancel(ctx) wg.Add(len(users)) for _, u := range users { go func() { defer wg.Done() select { case name, err := fetch(ctx, u): if err != nil { ch <- err return } mu.Lock() names[name] = names[name] + 1 mu.Unlock() case <-ctxWithCancel.Err: } }() } return names, nil }

137
/2