Wildberries / WB - 9 (Рекламная платформа)
- GMP модель
go/concurrency - Netpoller
go/runtime - Для чего нужен mutex
go/sync
Задача: Написать асинхронный инкремент счетчика var count int. go/concurrency
Заголовок раздела «Задача: Написать асинхронный инкремент счетчика var count int. go/concurrency»Задача: Написать асинхронные GET запросы на google.com, wildberries.ru. go/concurrency
Заголовок раздела «Задача: Написать асинхронные GET запросы на google.com, wildberries.ru. go/concurrency»Задача: Задача на change pointer. go/basics
Заголовок раздела «Задача: Задача на change pointer. go/basics»type Person struct { Name string}
func changeName(person *Person) { person = &Person{ Name: "Olga ", }}
func main() { person := &Person{ Name: "Eugene ", }
fmt.Println(person.Name) // что отобразится после вызова? changeName(person) fmt.Println(person.Name) // что отобразится после вызова?}Задача: Требуется распараллелить fetch функцию, в случае возврата ошибки одной из рутин, стопать все (сигнатуры fetch и Do менять нельзя). go/concurrency
Заголовок раздела «Задача: Требуется распараллелить fetch функцию, в случае возврата ошибки одной из рутин, стопать все (сигнатуры fetch и Do менять нельзя). go/concurrency»func main() { t := time.Now() names, err := Do(context.Background(), []User{ {"Paul "}, {"Jack "}, {"Jack "}, {"Mike "}, }) if err != nil { fmt.Println("Error: ", err) os.Exit(1) } fmt.Println("Result: ", names) fmt.Println("Elapsed time: ", time.Since(t))}
// fetch что-то делаем по сети.func fetch(_ context.Context, u User) (string, error) { time.Sleep(time.Millisecond * 10) // имитация задержки return u.Name, nil}
func Do(ctx context.Context, users []User) (map[string]int64, error) { names := make(map[string]int64, len(users))
for _, u := range users { name, err := fetch(ctx, u) if err != nil { fmt.Println(err) os.Exit(1) }
names[name] = names[name] + 1 }
return names, nil}Задача: Сделать ревью кода. go/basics
Заголовок раздела «Задача: Сделать ревью кода. go/basics»type Data struct { id int `json:"id "` firstName string `json:"first_name "`}
func main() { db, err := sql.Open("postgres ", "postgresql://strong_password:user@database-host:5000/my_db ") if err != nil { log.Println("Error opening the database:", err) return } defer db.Close()
ctx := context.TODO() var wg sync.WaitGroup data := []Data{{1, "Alice "}, {2, "Bob "}, {3, "Charlie "}} for _, d := range data { go func() { wg.Add(1)
d.firstName = "New " + d.firstName
query := fmt.Sprintf("INSERT INTO data (name) VALUES ('%s ')", d.firstName) _, err := db.Exec(query)
if err != nil { log.Println("Error inserting data:", err) } wg.Done() }() }
wg.Wait()
f, err := json.Marshal(data) if err != nil { log.Println("Error inserting data:", err) return }
var buf bytes.Buffer buf.Write(f)
req, err := http.NewRequestWithContext(ctx, "GET ", "domain.ru/my_path ", &buf) if err != nil { log.Println("Error creating request:", err) return }
resp, err := (&http.Client{}).Do(req) if err != nil { log.Println(err) return }
log.Println(io.ReadAll(resp.Body))}