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)
}

  

原文地址:https://www.cnblogs.com/yzg-14/p/12254563.html

时间: 2024-07-31 18:56:42

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

zbb20180930 java,nio直接缓冲区与非直接缓冲区别

直接缓冲区与非直接缓冲区别 分散读取与聚集写入 非直接缓冲区 通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中! 案例展示 这里提供一个名为Python1,大小为397.1MB的zip文件: 现分别用直接缓冲区和非直接缓冲区对上面文件进行文件复制,看哪个缓冲区耗时最短,效率更高? 代码示例 public class NoStraightChannel { public static void main(String[] args) throws IOException

OpenGL中实现双缓冲技术

在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);.这里将我们惯用的GLUT_SINGLE替换为GLUT_DOUBLE,意为要使用双缓冲而非单缓冲. 2. 调用glutDisplayFunc(display)注册回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针. 3. 调用

缓冲和缓存

1.1 缓冲 缓冲的英文单词是buffer,国内常译为缓冲或缓冲区. 缓冲主要有如下2个作用: 1. 通过引入缓冲区中间层消除了设备速率不匹配问题: 2. 通过预设一定大小的缓冲区减少对外存设备的频繁存取(提高吞吐). 1.2 缓存 缓存的英文单词是cache,国内常译为缓存. 缓存主要利用数据的局部性特征,将常用数据缓存,加快存取数据的速率,降低数据访问延迟. 1.3 小结 缓冲侧重存取数据的数量,缓存侧重存取数据的速率. 缓冲由于流式存储,具有明显的顺序访问特征,缓存保证高速存取,并且随时替

Java NIO与IO的差别和比較

导读 J2SE1.4以上版本号中公布了全新的I/O类库.本文将通过一些实例来简介NIO库提供的一些新特性:非堵塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题. 1. Buffer:它是包括数据且用于读写的线形表结构.当中还提供了一个特殊类用于内存映射文件的I/O操作. 2. Charset:它提供Unicode字符串影射到字节序列以及逆影射的操作. 3. Channels:包括socket

Java NIO与IO的区别和比较

传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大.使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务.由于线程数量小于连接数量,所以每个线程进行IO操作时就不能阻塞,如果阻塞的话,有些连接就得不到处理,NIO提供了这种非阻塞的能力. 小量的线程如何同时为大量连接服务呢,答案就是就绪选择.这就好比到餐厅吃饭,每来一桌客人,都有一个服务员专门为你服务,

JAVA学习总结之IO/NIO概述

本文参考了众多文章,很多文章的源连接已经无法找到了,如果本文引用了您的文章,请联系我,我会在具体的位置加入您的连接地址,同时本文NIO部分大都引用 NIO详解 这篇文章. IO流 java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为节点流,其它的流则称为处理流.处理输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,处理输出流的原理也类似. java中的流分为输入流和输出流,分别表示流中的字节数据两种流动方向.(以

第三章 进程

思维导图: 进程(Process) 要解决的问题: 顺序环境 计算机只有一个程序在运行,该程序独占系统中所有资源,其执行不受外界影响 并发环境: 一定时间内,物理机器上由两个或两个以上的程序同处于开始运行但尚未结束的状态,并且次序不是事先确定的 特征 多道程序设计对OS的要求 进程 一个进程包括: 进程与程序的区别 进程的特点: 进程存在意味着: 进程的状态 进程执行时,改变状态 进程的状态不是固定不变的,而是在不断变化 终止(退出exit)状态 PCB(Process Control Bloc

Socket netty ...

1.什么是Socket? Socket就是为网络服务提供的一种机制. 通讯的两端都有Sokcet 网络通讯其实就是Sokcet间的通讯 数据在两个Sokcet间通过IO传输. 2.TCP与UDP在概念上的区别 udp: a.是面向无连接, 将数据及源的封装成数据包中,不需要建立建立连接 b.每个数据报的大小在限制64k内 c.因无连接,是不可靠协议 d.不需要建立连接,速度快 tcp:a.建议连接,形成传输数据的通道. b.在连接中进行大数据量传输,以字节流方式 c 通过三次握手完成连接,是可靠

全国计算机等级考试二级C语言程序设计考试大纲(2013年版)

转自:http://www.freencre.com/c2_artde_28.html 基本要求 1. 熟悉Visual C++6. 0集成开发环境. 2. 掌握结构化程序设计的方法,具有良好的程序设计风格. 3. 掌握程序设计中简单的数据结构和算法并能阅读简单的程序. 4. 在Visual C++6. 0集成环境下,能够编写简单的C程序,并具有基本的纠错和调试程序的能力. 考试内容 一.C语言程序的结构 1. 程序的构成,main函数和其他函数. 2. 头文件,数据说明,函数的开始和结束标志以