Go问答 菜鸡求大佬帮忙解答下 channel 相关的问题

Victoryship · 2021年02月20日 · 最后由 Victoryship 回复于 2021年02月24日 · 80 次阅读
func TestPrintf(T *testing.T)  {
    ch := make(chan int)
    go Letter(ch)
    go Number(ch)
    time.Sleep(time.Second)
}


func Letter(ch chan int) {
    s := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i := 0; i < len(s); i++ {
        ch <- i
        fmt.Println(string(s[i]))
    }
}

func Number(ch chan int)  {
    for i := 0; i < 26; i++ {
        <- ch
        fmt.Println(i)
    }
}

为啥这里样打印最开始一个是交替打印"A""0""1"或者"0""A""B",而后面的输出字母或者数字都会一下打印两次了。类似 A 0 1 B C 2 3 D E 4 5 这样,我的理解应该是 chan 里发送数据,没有消费掉因该在阻塞状态,只会打印一次这样。

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
1楼 已删除
  1. 协程执行的时候,并不知道是那个先运行,因此第一个输出是随机的
  2. 打印 2 次的问题,你可以 A0 1B C2 这样看 通道阻塞的情况,A0 输出很好理解,无缓冲通道读取阻塞,输出 A0,然后执行 ch <-i,阻塞,协程执行<-ch,继续执行输出 1,如此反复
func TestPrintf(T *testing.T)  {
    ch := make(chan int)
    boolCh := make(chan bool)
    go func() {
        s := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for i := 0; i < len(s); i++ {
            <- ch
            fmt.Println(string(s[i]))
            boolCh <- true
        }
    }()

    go func() {
        for i := 0; i < 26; i++ {
            ch <- i
            if <- boolCh {
                fmt.Println(i)
            }
        }
    }()
    time.Sleep(time.Second)
}

额。。。这个只有你自己理解,真没有办法告诉你为啥。。。

924855285 回复

谢谢大佬,慢慢好像明白了

anyanfei 回复

嗯嗯,还是自己多打印理解。谢谢大佬

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册