码迷,mamicode.com
首页 > 其他好文 > 详细

golang:channel消息传递练习

时间:2020-06-14 01:31:40      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:color   sharp   func   就会   lse   tin   注意   传递   lan   

用channel实现一个消息传递,需求如下:

//启动一个goroutine,生成100个数发送到ch1
//启动一个goroutine,从ch1取值,计算它的平方放到ch2中
//再main中,从ch2打印出来

直接贴最后代码。

var wg sync.WaitGroup
func main(){
    wg.Add(2)
    ch1 := make(chan int, 100)
    ch2 := make(chan int, 100)

    go func(){
        defer wg.Done()
        for i:=0; i<100; i++{
            ch1 <- i
        }
        close(ch1)
    }()
    go func(){
        defer wg.Done()
        for x := range ch1{
            ch2 <- x * x
        }
        close(ch2)
    }()

    wg.Wait()
    for i:= range ch2{
        fmt.Println(i)
    }
}
注意:
接受消息时,当需要告知另一个goroutine数据已经发送完毕时,需要关闭该channel.

go圣经

其实你并不需要关闭每一个channel。只有当需要告诉接收者goroutine,所有的数据已经全部发送时才需要关闭channel。
不管一个channel是否被关闭,当它没有被引用时将会被Go语言的垃圾自动回收器回收。
(不要将关闭一个打开文件的操作和关闭一个channel操作混淆。对于每个打开的文件,都需要在不使用的使用调用对应的Close方法来关闭文件。)

 

这里接受从channel消息的有两种方法,第一种
i, ok := <-ch1 // 通道关闭后再取值ok=false
if !ok {
	break
}

  当channel close的时候,并且channel的数据已经被全部接受为空时。下一次接受仍然不报错,只不过只是ok值为false,说明接受消息已经结束,可以继续执行下面的步骤。

  第二种方法,就是代码中的range方法,如果channel close时,并且消息全部接收完毕,channel为空时,range就会自动退出。



golang:channel消息传递练习

标签:color   sharp   func   就会   lse   tin   注意   传递   lan   

原文地址:https://www.cnblogs.com/icehole/p/13122330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!