1. 非缓冲和缓冲

package main

import (
"fmt"
"strconv"
) func main() {
/*
非缓冲通道:make(chan T)
一次发送,一次接收,都是阻塞的
缓冲通道:make(chan T , capacity)
发送:缓冲区的数据满了,才会阻塞
接收:缓冲区的数据空了,才会阻塞 */
ch1 := make(chan int) //非缓冲通道
fmt.Println(len(ch1), cap(ch1)) //0 0
//ch1 <- 100 //阻塞式的,需要有其他的goroutine解除阻塞,否则deadlock ch2 := make(chan int, 5) //缓冲通道,缓冲区大小是5
fmt.Println(len(ch2), cap(ch2)) //0 5 ch2 <- 100
fmt.Println(len(ch2), cap(ch2)) //1 5
ch2 <- 200
ch2 <- 300
ch2 <- 400
ch2 <- 500
fmt.Println(len(ch2), cap(ch2)) //5 5
//ch2 <- 600 //没有接触阻塞,满了 ch3 := make(chan string, 4)
go sendData(ch3) for {
v, ok := <-ch3
if !ok {
fmt.Println("读完了。。", ok)
break
}
fmt.Println("\t读取的数据是:", v)
}
fmt.Println("main。。over。。。。") } func sendData(ch chan string) {
for i := 0; i < 10; i++ {
ch <- "数据" + strconv.Itoa(i)
fmt.Printf("子goroutine中写出第 %d 个数据\n", i)
}
close(ch)
}

2. 双向通道

package main

import "fmt"

func main() {
/*
双向:
chan T
chan <- data,发送数据,写出
data <- chan,获取数据,读取 单向:定向
chan <- T,只支持写
<- chan T,只读
*/
ch1 := make(chan string)
done := make(chan bool)
go sendData(ch1,done) data := <- ch1 //读取
fmt.Println("子goroutine传来:",data) ch1 <- "我是main" //发送 <- done
fmt.Println("main..over...")
} func sendData(ch1 chan string,done chan bool){
ch1 <- "我是" //发送 data := <- ch1 //读取
fmt.Println("main goroutine传来:",data) done <- true }

3. 单向通道

package main

import "fmt"

func main() {
/*
单向:定向
chan <- T,只支持写
<- chan T,只读 定向通道:
双向:-->函数:只读,只写
*/
ch1 := make(chan int) //双向,读,写
//ch2 := make(chan<- int) //单向,只能写,不能读
//ch3 := make(<-chan int) //单向,只能读,不能写
//
//ch1 <- 100
//data := <-ch1
//ch2 <- 1000
//data := <-ch2 //invalid operation: <-ch2 (receive from send-only type chan<- int)
//data := <-ch3
//ch3 <- 2000 //invalid operation: ch3 <- 2000 (send to receive-only type <-chan int) go fun1(ch1) //可读,可写
//go fun1(ch2) //只写 data := <-ch1
fmt.Println("fun1函数中写出的数据是:", data) go fun2(ch1)
//fun2(ch3) ch1 <- 200
fmt.Println("main..over...")
} //该函数,只能操作只写的通道
func fun1(ch chan<- int) {
//在函数内部,对于ch1通道,只能写数据,不能读取数据
ch <- 100
fmt.Println("fun1函数结束。。。")
} //该函数,只能操作只读的通道
func fun2(ch <-chan int) {
data := <-ch
fmt.Println("fun2函数,从ch中读取的数据是:", data)
}

  

Go非缓冲/缓冲/双向/单向通道的更多相关文章

  1. OpenGL中实现双缓冲技术

    在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | G ...

  2. Hibernate一级缓冲

    Hibernate的一级缓冲 什么是缓冲 缓冲概念: 数据存在数据库中,数据库本身就是一个文件系统,使用流的方式操作文件,但是文件中有很多的内容,用流的操作得效率就低. 解决办法: 把数据存在内存中, ...

  3. 基于直接缓冲区和非直接缓冲区的javaIO文件操作

    基本概念: 1. 非直接缓冲区:  指的是通过jvm来缓存数据的,应用程序要读取本地数据要经历从本地磁盘到物理内存,然后copy到jvm中,然后再通过流的方式读取到应用程序中,写的操作正好与之相反. ...

  4. Java NIO与IO的区别和比较

    传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大.使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数 ...

  5. Java NIO与IO的差别和比較

    导读 J2SE1.4以上版本号中公布了全新的I/O类库.本文将通过一些实例来简介NIO库提供的一些新特性:非堵塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO NIO包(java.nio.*)引入 ...

  6. Socket netty ...

    1.什么是Socket? Socket就是为网络服务提供的一种机制. 通讯的两端都有Sokcet 网络通讯其实就是Sokcet间的通讯 数据在两个Sokcet间通过IO传输. 2.TCP与UDP在概念 ...

  7. Java基础——NIO(一)通道与缓冲区

    一.概述 1.什么是NIO NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 在Java ...

  8. html5新特性与用法大全了解一下

    有好多小伙伴私聊我问我html5新特性 和用法,下面我给大家具体介绍一下html5都新加了哪些新特性,下面我给大家总结一下. 1)新的语义标签 footer header 等等2)增强型表单 表单2. ...

  9. VLC2.2.4命令参数

    用法: vlc [选项] [流] ...您可以在命令行中指定多个流.它们将被加入播放列表队列.指定的首个项目将被首先播放. 选项样式: --选项 用于设置程序执行期间的全局选项. -选项 单字母版本的 ...

随机推荐

  1. 【Python】表白程序

     程序链接:https://www.lanzous.com/i8xj5mh # 打包操作 # 安装pyinstaller # cmd输入 pip install pyinstaller # shift ...

  2. ORA-12638: 身份证明检索失败

    PLSQL 连接Oracle时提示 “ORA-12638: 身份证明检索失败” 错误, 但是开发IDE可以正常连接,DataGrid 可以正常连接,所以确定是本地设置问题. 网上搜了一下,说是因为Or ...

  3. 码云项目克隆至github

    个人博客 地址:http://www.wenhaofan.com/article/20181104211917 因为我的博客项目一开始是存放在码云上面的,但是我又想在GitHub上有该项目的提交记录, ...

  4. js上传文件工具类

    个人博客 地址:http://www.wenhaofan.com/article/20180808210417 jQuery.extend({ uploadUtil:function(){ } }); ...

  5. 支持CSS3的高级CSS

    一.匹配部分字符串 在CSS2中,可以使用[ href='info.htm' ] 这样的属性选择器来匹配href属性中的字符,但是无法只匹配部分字符串.而CSS3给出了三个新的运算符:^ , $ 和 ...

  6. SpringBoot框架---配置

    1.更改tomcat的端口号: application.properties 配置文件中, server.port=9090 2.设置上下文路径: server.servlet.context-pat ...

  7. Data Manipulation with dplyr in R

    目录 select The filter and arrange verbs arrange filter Filtering and arranging Mutate The count verb ...

  8. Weather

    Scientists say a lot about the problems of global warming and cooling of the Earth. Indeed, such nat ...

  9. 2019牛客训练赛第七场 C Governing sand 权值线段树+贪心

    Governing sand 题意 森林里有m种树木,每种树木有一定高度,并且砍掉他要消耗一定的代价,问消耗最少多少代价可以使得森林中最高的树木大于所有树的一半 分析 复杂度分析:n 1e5种树木,并 ...

  10. POJ 1330(LCA/倍增法模板)

    链接:http://poj.org/problem?id=1330 题意:q次询问求两个点u,v的LCA 思路:LCA模板题,首先找一下树的根,然后dfs预处理求LCA(u,v) AC代码: #inc ...