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. Appium学习2-Appium-desktop的使用

    安装: 下载路径:https://github.com/appium/appium-desktop/releases 选择最新的安装包即可. 使用 1.点击打开应用程序,进入到配置项. 2.配置以下信 ...

  2. php 获取header信息

    nginx服务器获取header信息: 如:获取token: $_SERVER['HTTP_TOKEN']; 获取自定义的参数采用$_SERVER['参数名'] Apache服务器获取header信息 ...

  3. 使用ajax向后台发送数据

    第一种最原始的方式就是手动拼接json数组: var name="text"; $.ajax({ url:"". data:{'name':name} succ ...

  4. Spring-JDBCTemplate介绍

        一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.c ...

  5. python3运行调用htmltestrunner时,报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0

    之前解决过一次,又忘了,这次写下来了..百度没有的,跟我环境有关! 环境:自动化运行环境python3.6.5 上期说到了,写了一个bat来运行runallcase.py. 但是双击运行却报错:Uni ...

  6. glog入门demo

    glog 一. 下载与安装 git clone https://github.com/google/glog.git cd glog ./autogen.sh ./configure make mak ...

  7. JavaScript的BOM对象

    JavaScript的BOM对象 BOM:浏览器对象模型 JavaScript和浏览器的关系:JavaScript的诞生就是为了能够让它再浏览器中运行. 1. 操作BOM对象 1.1 window w ...

  8. 微信小程序 selectComponent 值为null

    这个东西的执行时间感觉有点迷, 我遇到的情况是在page 的onReady  onShow 当中 使用 selectComponent 无法获取到子组件的对象 只好退而求其次  在需要触发的方法当中 ...

  9. hrtf 旋转音效matlab实现

    原理参考: http://www.mahong.me/archives/97 将音频分段,各个段分别使用hrtf在Ls, L, R, Ls, Rrs, Lrs位置处的filter系数.是声音听起来来自 ...

  10. 【Python】time库