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. mysql 数据库基础操作

    一 知识储备 MySQL数据库基本操作知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student, ...

  2. 在电脑上用chrome浏览器调试android手机里的网页代码时,无法看到本地加载的js文件

    在需要调试的js文件最顶部加上代码就可以看到了: console.log('haha'); debugger;

  3. vue学习指南:第十五篇(详细) - Vuex

    Vuex 一.基础 1. Vuex 相当于 vue的数据仓库 2. Vuex 是 vue 的状态管理工具 3. Vuex中的 state 只能通过mutations 改变 4. Vuex很适合做购物车 ...

  4. jdbc中SQL语句拼接java变量

    例如:String sql = "select * from user where username='" + username + "' and password =' ...

  5. LED Holiday Light - Color Creation Of LED Christmas Lights

    In the long and interesting history of Christmas lights, nothing is brighter than light-emitting dio ...

  6. Echarts--来自官网

    引入 ECharts ECharts 3 开始不再强制使用 AMD 的方式按需引入,代码里也不再内置 AMD 加载器.因此引入方式简单了很多,只需要像普通的 JavaScript 库一样用 scrip ...

  7. 如何在vivado中调用ultraedit 编辑器

    ISE下点击菜单Edit -> Preferences -> Editor. 在Editor选项框里选择Custom,在Command line syntax文本框里输入: {C:/Pro ...

  8. Working copy not locked; this is probably a bug, please report

    问题描述 svn: Unable to lock 'G:\chengXu\2017_Year\JFW\Easy7\src' 解决方案

  9. jvm(n):JVM面试

    Jvm内存结构,一般是面试官对Java虚拟机这块考察的第一问. Java虚拟机的内存结构一般可以从线程共有和线程私有两部分起头作答,然后再详细说明各自的部分,类似树状结构的作答,好处就是思路清晰,面试 ...

  10. 常用bat脚本整理

    在当前文件夹下 shift +鼠标右键 打开终端   输入 tree /f > 1.txt 则将文件夹下的文件名放入1.txt文件中.不包含绝对路径. 要么是写个.bat文件,文件内容为 dir ...