golang channal中buf和for range一些用法

iwbno1 · · 7326 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

         go的gocontinue用法实现了轻量级的线程,可以被大量创建。线程之间用channal通信,以下说说基本用法。

         channal的buf

c:=make(chan int ,3)

3就是设定的chanal的缓存量,缓存只意味着这个创建的channal可以同时存入3个数据,并不意味读channal时可以同时读出。

        x:=<-c

        读channal时仍然是以阻塞的方式一次一个地将数据读出。

        当channal缓存中存在有效数据时,即使close掉channal,仍然可以读出buf里的数据。需要注意的是,从close掉的channal读数据时,channal是不阻塞的,当channal中的buf数据被读完时,仍然会以不阻塞的方式读出0值。

      

       channal的for range

      c:=make(chan int )

       for i:=range c {

}

        for rangge的方式可以取出channal中的数据,它取数据的方式是阻塞取数据,这和通常的方式是一致的,当channal中的数据为空时,它会阻塞等待数据。

如果在已经close掉channal的情况下,for range只会读完channal中的有效数据,然后接着往下执行,而不是向上面情况一样不断的读出0。


        简单测试代码

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan int, 3)
    fmt.Println("no buf")
    go test1(c)
    go test2(c)
    go test3(c)
    time.Sleep(3 * time.Second)
    close(c)

    //fmt.Println(<-c)

    for i := range c {
        fmt.Println(i)
    }

    //fmt.Println(<-c)

    //for i := range c {
    //    fmt.Println(i)
    //}
}

func test1(c chan int) {
    c <- 1
}

func test2(c chan int) {
    c <- 2
}

func test3(c chan int) {
    c <- 3
}


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:iwbno1

查看原文:golang channal中buf和for range一些用法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

7326 次点击  ∙  1 赞  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传