应该从 slice 中获取所有值,而最终不会出现死锁。当我不使用waitGroups时,我不会出现死锁错误。
是我用来代替waitGroup的东西,它帮助了
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
c := make(chan int)
a := []int{1, 3, 10, 8, 15, 23}
wg.Add(len(a))
go func(i []int) {
for _, v := range i {
c <- v
}
}(a)
go Print(c)
wg.Wait()
}
func Print(c chan int) {
for v := range c {
fmt.Println(v)
}
wg.Done()
close(c)
}
最佳答案
您对同步机制感到困惑。关键是要同步异步工作程序。不是要处理的元素数量。
写操作结束后您没有关闭 channel ,但是读操作应该已经结束之后。错了
您正在使生产者和消费者都异步。这有点奇怪。由于您已经在main中拥有一个线程,因此可以利用它来启动虚假例程。
修复后代码的一些变化
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
c := make(chan int)
a := []int{1, 3, 10, 8, 15, 23}
wg.Add(1) // one async worker
go Print(c) // ensure the worker is started upfront
for _, v := range a {
c <- v // write the data
}
close(c) //then close
wg.Wait()
fmt.Println("done")
}
func Print(c chan int) {
for v := range c { // the loop will break because the channel is closed.
fmt.Println(v)
}
wg.Done()
}
您也可以在没有任何 WaitGroup 的情况下进行构建。
package main
import (
"fmt"
)
func main() {
c := make(chan int)
a := []int{1, 3, 10, 8, 15, 23}
go func() {
for _, v := range a {
c <- v // write the data
}
close(c) //then close
}()
for v := range c { // the loop will break because the channel is closed.
fmt.Println(v)
}
fmt.Println("done")
}