Go 不在控制台上打印接收通道值

Go 不在控制台上打印接收通道值,go,Go,我是GoLang的一名学习者,试图尝试和学习同步软件包和chan概念 下面是我正在运行的代码,我希望在控制台上打印接收通道值,但是没有打印该值,它有时打印值,但不总是打印 如果我在没有将其放入go例程的情况下对chan进行测距,那么它将打印所有通道值,但失败并出现错误“致命错误:所有goroutines都处于休眠状态-死锁!” 我尝试使用通道“完成”同步通道读取,但在这种情况下,它再次开始失败,并出现相同的错误。我还尝试了waitGroup API,您可以在我的代码中看到它(注释),但这对我也不

我是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()
//