Go非缓冲/缓冲/双向/单向通道
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非缓冲/缓冲/双向/单向通道的更多相关文章
- OpenGL中实现双缓冲技术
在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | G ...
- Hibernate一级缓冲
Hibernate的一级缓冲 什么是缓冲 缓冲概念: 数据存在数据库中,数据库本身就是一个文件系统,使用流的方式操作文件,但是文件中有很多的内容,用流的操作得效率就低. 解决办法: 把数据存在内存中, ...
- 基于直接缓冲区和非直接缓冲区的javaIO文件操作
基本概念: 1. 非直接缓冲区: 指的是通过jvm来缓存数据的,应用程序要读取本地数据要经历从本地磁盘到物理内存,然后copy到jvm中,然后再通过流的方式读取到应用程序中,写的操作正好与之相反. ...
- Java NIO与IO的区别和比较
传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大.使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数 ...
- Java NIO与IO的差别和比較
导读 J2SE1.4以上版本号中公布了全新的I/O类库.本文将通过一些实例来简介NIO库提供的一些新特性:非堵塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO NIO包(java.nio.*)引入 ...
- Socket netty ...
1.什么是Socket? Socket就是为网络服务提供的一种机制. 通讯的两端都有Sokcet 网络通讯其实就是Sokcet间的通讯 数据在两个Sokcet间通过IO传输. 2.TCP与UDP在概念 ...
- Java基础——NIO(一)通道与缓冲区
一.概述 1.什么是NIO NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 在Java ...
- html5新特性与用法大全了解一下
有好多小伙伴私聊我问我html5新特性 和用法,下面我给大家具体介绍一下html5都新加了哪些新特性,下面我给大家总结一下. 1)新的语义标签 footer header 等等2)增强型表单 表单2. ...
- VLC2.2.4命令参数
用法: vlc [选项] [流] ...您可以在命令行中指定多个流.它们将被加入播放列表队列.指定的首个项目将被首先播放. 选项样式: --选项 用于设置程序执行期间的全局选项. -选项 单字母版本的 ...
随机推荐
- (转) maven snapshot和release版本的区别
在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一 天要发布N次.我们知道,maven的依赖管理是基于版本管理的 ...
- Hog实例
1.计算Hog的特征得维度: #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2 ...
- yii2验证规则
验证规则 1.内置验证规则 [['sex', 'partner_id'], 'integer'], [['partner_id', 'camp_id',], 'required'], [['creat ...
- TD - 数据验证
基本方法 this.assetCounts.focus();//聚焦 this.btnSave.cancel();//按钮取消 this.assetPerson.isValid()//是否有效,tru ...
- sql developer执行sql文件
sql语句可以直接copy到sqlDeveloper的sql window中执行,但是当sql语句过多时,我们可以在command window中来执行sql文件 具体的命令是: start d:\m ...
- SDF数据库
一.SDF数据库初探 SDF是一个标准缩略数据库格式.这个数据库包含扩展名为.sdf的文件并且以结构化文件格式进行数据存储.这些SDF文件通常用于在不同数据库应用之间移动数据.它允许一个用户将一个软件 ...
- 怎样判断一个exe可执行程序是32位的还是64位的(转)
转载自:https://blog.csdn.net/qq_23308823/article/details/54898119 怎样判断一个exe可执行程序是32位的还是64位的
- python解压压缩包的几种方式
这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar 简介 gz: 即gzip,通常只能压缩一个文件.与tar结合起来就可以实现先打包,再压缩. tar: ...
- Python_递归函数
楔子 在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙 ...
- html5 标准文档结构
<!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <meta charset=" ...