简析go语言channel
channel是go语言中一种重要的并发原语:既可以实现goroutine之间的通信,又可以实现goroutine之间的同步。
可以像使用普通变量那样使用channel:定义channel类型变量,为channel类型变量赋值,将channel作为参数传递给函数/方法,将channel作为返回值从函数/方法中返回,甚至将channel原语发送到其他channel中。
c := make(chan int) // 创建一个无缓冲(unbuffered)的int类型的channel c := make(chan int, 5) // 创建一个带传冲的int类型的channel c <- x // 向channel c发送一个值 <- c // 从channel c中接收一个值 x = <- c // 从channel c接收一个值并将值存储到变量x中 x, ok = <- c // 从channel c接收一个值并将值存储到变量x中,若channel关闭了,ok将被置为false for i := range c // 将for ... range和channel结合使用 close(c) // 关闭channel c := make(chan chan int) // 创建一个无缓冲的chan, int类型的channel func stream(ctx context.Context, out chan<- Value) error // 将只发送channel作为函数参数 func spwan(...) <- chan T // 将只接收类型channel作为返回值
当需要同时对多个channel进行操作时,结合使用Go为CSP模型提供的另一个原语select。通过select可以同时在多个channel上进行发送/接收操作:
select { case x := <- c: // 从channel c接收数据 ... case y, ok := <- c: // 从channel c接收数据并判断c是否已经关闭 ... case c <- z: // 将z的值发送到channel c中 ... default: // 当上面case中的channel均无法实施时,执行默认操作 ... }
Go语言基础及实战 文章被收录于专栏
Go语言学习笔记、语法知识、技术要点和个人理解及实战