Перейти к содержимому

Wildberries / WB - 9 (Рекламная платформа)

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
}
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))
}