注册 登录
  • 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!

Go语言的管道Channel

go 水墨上仙 1512次浏览 已收录 手机上查看

channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值。
ch <- v // 将 v 送入 channel ch。
v := <-ch // 从 ch 接收,并且赋值给 v。
(“箭头”就是数据流的方向。)
和 map 与 slice 一样,channel 使用前必须创建:
ch := make(chan int)
默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。

package main
import "fmt"
func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    c <- sum  // send sum to c
}
func main() {
    a := []int{7, 2, 8, -9, 4, 0}
        c := make(chan int)
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
        x, y := <-c, <-c  // receive from c
    fmt.Println(x, y, x + y)
}

缓冲&nbspchannel

channel&nbsp可以是带缓冲的。为&nbspmake&nbsp提供第二个参数作为缓冲长度来初始化一个缓冲&nbspchannel:

ch&nbsp:=&nbspmake(chan&nbspint,&nbsp100)
向缓冲&nbspchannel&nbsp发送数据的时候,只有在缓冲区满的时候才会阻塞。当缓冲区清空的时候接受阻塞。

修改例子使得缓冲区被填满,然后看看会发生什么。

package main
import "fmt"
func main() {
    c := make(chan int, 2)
    c <- 1
    c <- 2
    fmt.Println(<-c)
    fmt.Println(<-c)
}

Range&nbsp和&nbspClose

发送者可以&nbspclose&nbsp一个&nbspchannel&nbsp来表示再没有值会被发送了。接收者可以通过赋值语句的第二参数来测试&nbspchannel&nbsp是否被关闭:当没有值可以接收并且&nbspchannel&nbsp已经被关闭,那么

v,&nbspok&nbsp:=&nbspok&nbsp会被设置为&nbspfalse。

循环&nbspfor&nbspi&nbsp:=&nbsprange&nbspc&nbsp会不断从&nbspchannel&nbsp接收值,直到它被关闭。

注意:&nbsp只有发送者才能关闭&nbspchannel,而不是接收者。向一个已经关闭的&nbspchannel&nbsp发送数据会引起&nbsppanic。

还要注意:channel&nbsp与文件不同;通常情况下无需关闭它们。只有在需要告诉接收者没有更多的数据的时候才有必要进行关闭,例如中断一个&nbsprange。

package main
import (
    "fmt"
)
func fibonacci(n int, c chan int) {
        x, y := 1, 1
        for i := 0; i < n; i++ {
                c <- x
                x, y = y, x + y
        }
        close(c)
}
func main() {
        c := make(chan int, 10)
    go fibonacci(cap(c), c)
        for i := range c {
                fmt.Println(i)
        }
}

 


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明Go语言的管道Channel
喜欢 (0)
[开心洋葱]
分享 (0)
水墨上仙
关于作者:
水墨上仙
加载中……