chan是golang中非常重要的一个东西,用来做goroutine的通信,因为golang程序必然会有多个goroutine,如何同步这些goroutine就很重要了。

使用chan时有几个心得: (推荐学习:go)

首先,永远是符号<-进行读取或者写入,譬如v,ok := <-c是读取,而c <- v是写入。

其次,读取时,如果没有ok,也是可以读取的。不过如果closed也是能读的,没有赋值而已;如果要知道是否closed得加ok,也就是除非chan永远不关闭,否则读取应该用v,ok := <-c而不是用v := <-c的方式。

再次,不能向closed的chan写入,所以一般写入时需要用一个信号的chan(一般buffer为1),来判断是否写入或者放弃,用select判断是写入成功了,还是正在关闭需要放弃写入。

最后,如果closed后,chan有数据,ok还是true的,直到chan没有数据了才false。

当一个chanel被关闭后,再取出不会阻塞,而是返回零值

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

输出

1230

更多相关文章

  1. golang如何判断数据类型
  2. golang数据类型有哪些
  3. golang 如何处理大数据
  4. go语言数据类型转换教程
  5. Go语言中处理json数据的方法
  6. golang怎样读取json数据
  7. golang使用什么数据库?
  8. Go语言中操作MySQL数据库的方法
  9. golang如何连接数据库

随机推荐

  1. 黑马程序员——Java学习笔记 String类和
  2. 帮别人宣传哈—》JAVA高并发编程(后面会自
  3. vue、react等单页面项目部署到服务器的方
  4. java死锁的例子
  5. IntelliJ IDEA 2017 Mac(java开发集成环
  6. Webshpere启动报 java.lang.ArrayIndexOu
  7. Eclipse工程图标左下角报错
  8. 哈利·波特的考试 java描述
  9. 算法笔记_138:稳定婚姻问题(Java)
  10. Java web环境配置和Servlet实例HelloWorl