【发布时间】:2021-03-03 13:15:37
【问题描述】:
我在实践中发现了两种收集数据的方法。我的同事使用不同的方法。但是,github 上的大多数项目(例如 vault)都使用第二种方式。我无法决定哪个更好。你能解释一下为什么一种方法比另一种更好吗?
代码:https://play.golang.org/p/OKV7pAwyGuQ
package 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)
}
【问题讨论】:
标签: go concurrency goroutine