账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    如何改造下面的方法,让正常结束
    34
    0

    下面的方法现在会进入假死状态,问题:
    1.错误原因按理解标注上了,不知道对不对?不对请帮忙重新解释下。
    2.现在想请教大佬如何改造,只要能正常都有哪些改造方法。
    但是不能用带缓存的chan,这个已经测试可以。
    3.现在写法错误,主要问题是没有关闭chan,这样理解对吗?

    package main
    
    import (
        "fmt"
        "sync"
        "testing"
    )
    
    /**
    配合wait 关闭chan后读取chan
    不带缓存,必须是有空间才能写入
    错误示例eg: 不带缓存chan 并发写入 select读取
    错误原因:程序进入假死状态 ,因为close(info)要等w.Wait(),而w.Wait()要等for more{},这个循环体里不关闭,就进入假死状态
    */
    func test1_error(t *testing.T) {
        info := make(chan string)
        datas := []string{"a", "b", "c"}
        var w sync.WaitGroup
        w.Add(len(datas))
        for _, v := range datas {
            go func(info_ chan string, v_ string, w *sync.WaitGroup) {
                defer w.Done()
                fmt.Println("data:" + v_)
                //核心业务逻辑
                v_ = v_ + v_ //这里一定要用参数v_
                //管道写入
                info_ <- v_
            }(info, v, &w)
        }
        var more bool = true
        var val string
        for more {
            select {
            case val, more = <-info:
                if more {
                    fmt.Println("select 取值:" + val)
                } else {
                    fmt.Println("info closed")
                }
            }
        }
    
        w.Wait()
        //配合wait 此时可以关闭chan.如果是某一个协程写,就在那个协程里关闭chan
        close(info)
    }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 浅夏♀诗韵 普通会员 1楼

      很抱歉,您没有提供任何方法或具体的上下文,所以我无法为您提供具体的建议。如果您能提供更多信息或上下文,我会很乐意帮助您。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部