Go 不在控制台上打印接收通道值
我是GoLang的一名学习者,试图尝试和学习同步软件包和chan概念 下面是我正在运行的代码,我希望在控制台上打印接收通道值,但是没有打印该值,它有时打印值,但不总是打印 如果我在没有将其放入go例程的情况下对chan进行测距,那么它将打印所有通道值,但失败并出现错误“致命错误:所有goroutines都处于休眠状态-死锁!” 我尝试使用通道“完成”同步通道读取,但在这种情况下,它再次开始失败,并出现相同的错误。我还尝试了waitGroup API,您可以在我的代码中看到它(注释),但这对我也不起作用 谢谢你的帮助 源代码:Go 不在控制台上打印接收通道值,go,Go,我是GoLang的一名学习者,试图尝试和学习同步软件包和chan概念 下面是我正在运行的代码,我希望在控制台上打印接收通道值,但是没有打印该值,它有时打印值,但不总是打印 如果我在没有将其放入go例程的情况下对chan进行测距,那么它将打印所有通道值,但失败并出现错误“致命错误:所有goroutines都处于休眠状态-死锁!” 我尝试使用通道“完成”同步通道读取,但在这种情况下,它再次开始失败,并出现相同的错误。我还尝试了waitGroup API,您可以在我的代码中看到它(注释),但这对我也不
package main
import (
"fmt"
"sync"
)
type safeOperation struct {
i int
sync.Mutex
}
var wg sync.WaitGroup
func main() {
so := new(safeOperation)
ch := make(chan int)
//done := make(chan bool)
for i := 0; i < 5; i++ {
go so.Increment(ch)
go so.Decrement(ch)
}
go func() {
//wg.Add(1)
for c := range ch {
fmt.Println("Receiving Channel Value: ", c)
}
//wg.Done()
//done <- true
}()
//wg.Wait()
//<-done
fmt.Println("Value: ", so.GetValue())
fmt.Println("Main method finished")
}
func (so *safeOperation) Increment(ch chan int) {
//so.Lock()
//defer wg.Done()
so.i++
ch <- so.i
//so.Unlock()
}
func (so *safeOperation) Decrement(ch chan int) {
//so.Lock()
//defer wg.Done()
so.i--
ch <- so.i
//so.Unlock()
}
func (so *safeOperation) GetValue() int {
so.Lock()
v := so.i
so.Unlock()
return v
}
主程序包
进口(
“fmt”
“同步”
)
类型安全操作结构{
i int
同步互斥
}
var wg sync.WaitGroup
func main(){
so:=新(安全操作)
ch:=制造(成交量)
//完成:=制作(陈波)
对于i:=0;i<5;i++{
继续。增量(ch)
去吧。减量(ch)
}
go func(){
//工作组.添加(1)
对于c:=范围ch{
fmt.Println(“接收通道值:”,c)
}
//wg.Done()
//完成使用WaitGroup
的一个好模式是在发送到频道之前调用Add()
,或者使用go
关键字,在从频道接收后调用done()
。
通过这种方式,您可以确保无论是否在通道块上发送,始终按时调用Add()
我已更改了您的示例代码以执行此操作:
package main
import (
"fmt"
"sync"
)
type safeOperation struct {
i int
sync.Mutex
}
var wg sync.WaitGroup
func main() {
so := new(safeOperation)
ch := make(chan int)
for i := 0; i < 5; i++ {
wg.Add(1)
go so.Increment(ch)
wg.Add(1)
go so.Decrement(ch)
}
go func() {
for c := range ch {
fmt.Println("Receiving Channel Value: ", c)
wg.Done()
}
}()
wg.Wait()
//<-done
fmt.Println("Value: ", so.GetValue())
fmt.Println("Main method finished")
}
func (so *safeOperation) Increment(ch chan int) {
so.i++
ch <- so.i
}
func (so *safeOperation) Decrement(ch chan int) {
so.i--
ch <- so.i
}
func (so *safeOperation) GetValue() int {
so.Lock()
v := so.i
so.Unlock()
return v
}
主程序包
进口(
“fmt”
“同步”
)
类型安全操作结构{
i int
同步互斥
}
var wg sync.WaitGroup
func main(){
so:=新(安全操作)
ch:=制造(成交量)
对于i:=0;i<5;i++{
工作组.添加(1)
继续。增量(ch)
工作组.添加(1)
去吧。减量(ch)
}
go func(){
对于c:=范围ch{
fmt.Println(“接收通道值:”,c)
wg.Done()
}
}()
wg.Wait()
//