main
import (
"fmt"
"sync"
)
// complex request
func getData() string {
return "test"
}
func main() {
// first way
var wg1 sync.WaitGroup
var mu1 sync.Mutex
res1 := make([]string, 0, 10)
for i := 0; i < 10; i++ {
wg1.Add(1)
go func(wg *sync.WaitGroup, mu *sync.Mutex) {
defer wg.Done()
mu.Lock()
res1 = append(res1, getData())
mu.Unlock()
}(&wg1, &mu1)
}
wg1.Wait()
fmt.Println(res1)
// second way
var wg2 sync.WaitGroup
ch := make(chan string, 10)
for i := 0; i < 10; i++ {
wg2.Add(1)
go func(wg *sync.WaitGroup, ch chan string) {
defer wg.Done()
ch <- getData()
}(&wg2, ch)
}
wg2.Wait()
close(ch)
res2 := make([]string, 0, 10)
for data := range ch {
res2 = append(res2, data)
}
fmt.Println(res2)
}
строго говоря, если у вас индексы не пересекаются, вам вообще синхронизация не нужна
Обсуждают сегодня