我在这里看了很多关于SO的例子和问题,但仍然无法按照预期的方式运行相当简单的代码:
func main() {
ch := make(chan string)
var wg sync.WaitGroup
wg.Add(2)
go readFile("A", ch, wg)
go readFile("B", ch, wg)
go func() {
wg.Wait()
close(ch)
}()
printer(ch)
}
func readFile(name string, ch chan string, wg sync.WaitGroup) {
file, err := os.Open(name)
if err != nil {
fmt.Errorf("was not able to read from file %s: %s", name, err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
ch <- scanner.Text()
}
wg.Done()
}
func printer(ch chan string) {
for val := range ch {
fmt.Println(val)
}
}
所以我正在读取两个文件,将读取行推入一个通道,然后简单地将它们打印出来(一些代码从不需要的详细信息中简化)
两个goroutines,WaitGroup为他们两个,用Wait和close通道修复goroutine。
从我的观点来看,这与这个问题和豁免的答案非常相似:Let golang close used channel after all goroutines finished
那我的情况怎么了?
答案 0 :(得分:2)
首先按照sync.WaitGroup
说明的文档进行操作:
import "sync"
WaitGroup等待完成goroutine的集合。主要的 goroutine调用Add来设置要等待的goroutines的数量。然后 每个goroutine运行并在完成后调用Done。在同一个 时间,等待可以用来阻止所有goroutines完成。
首次使用后不得复制WaitGroup。
首次使用后不得复制WaitGroup。