Bruce Blog Bruce Blog
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航

Bruce Tao

运维界的该溜子
首页
  • CentOS
  • Ubuntu-Debian
  • 系统网络
  • 系统辅助工具
  • MySQL
  • Redis
  • Mongodb
  • Docker基础
  • Container基础
  • Kubernetes

    • Kubernetes基础
    • Kubernetes辅助
  • Container-Network
  • Jenkins
  • Gitlab
  • ArgoCD
  • Ansible
  • Terraform
  • AWS
  • MQ
  • NGINX
  • JumpServer
  • 基础
  • 函数模块
  • 框架
  • 基础

    • Golang环境
    • 语法
    • 数据类型与运算符
    • 分支语句
    • 循环语句
    • 数组
    • 切片
    • Map
    • String
    • 函数
    • 包的管理
    • 指针
    • 结构体
    • Go语言中的OOP
    • 方法和接口
    • 错误处理
  • Go进阶

    • Go进阶
  • Go框架

    • Go框架
  • Golang辅助

    • Golang辅助
  • CSS
  • HTML
  • JavaScript
  • 前端辅助
  • 常用命令
  • 性能监控工具
  • Windows下Docker使用
  • 日常学习
  • 其他导航
  • 基础

  • Go进阶

    • Go进阶
    • File操作
    • IO操作
    • 文件复制
    • 断点续传
    • bufio包
    • ioutil包
    • 遍历目录
    • 并发性Concurrency概念
    • Goroutine初识
    • Goroutine并发模型
    • Runtime包
    • 临界资源安全问题
    • sync包WaitGroup
    • 互斥锁
    • 读写锁
    • Channel通道
    • 关闭通道和通道上范围循环
    • 缓冲通道
    • 定向通道
      • time包中的通道相关函数
      • select语句
      • CSP并发模型
      • Go语言反射(一)
      • Go语言反射(二)
    • Go框架

    • Golang辅助

    • Golang
    • Go进阶
    Bruce
    2022-12-03
    目录

    定向通道

    # 定向通道

    # 一、双向通道

    通道,channel,是用于实现goroutine之间的通信的.一个goroutine可以向通道中发送数据,另一条goroutine可以从该通道中获取数据.目前为止的通道,都是既可以发送数据,也可以读取数据,又称这种通道叫双向通道.

    data := <- a //read from channel a
    a <- data //write to channel a
    
    1
    2

    双向通道,示例代码

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	/*
    		双向:
    			chan T
    				chan <- data,发送数据,写出
    				data <- chan,获取数据,读取
    		单向: 定向
    			chan <- T,只支持写
    			<- chan T,只读
    	*/
    
    	ch6 := make(chan string)
    	done := make(chan bool)
    	go sendData3(ch6, done)
    
    	data := <-ch6 //读取
    	fmt.Println("子goroutine传来: ", data)
    
    	ch6 <- "我是main" //发送
    	//time.Sleep(1 * time.Second) // 这里可以延时结束main 的goroutine
    	<-done
    	fmt.Println("main...over...")
    }
    
    func sendData3(ch6 chan string, done chan bool) {
    	ch6 <- "我是Bruce" //发送
    	data := <-ch6    //读取
    	fmt.Println("main goroutine传来: ", data)
    
    	done <- true
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38

    执行结果

    image-20221124221456200

    # 二、单向通道

    单向通道,也就是定向通道.

    之前的通道都是双向通道,可以通过这些通道接收或者发送数据,也可以创建单向通道,这些通道只能发送或者接收数据.

    单向通道,示例代码

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	/*
    		双向:
    			chan T
    				chan <- data,发送数据,写出
    				data <- chan,获取数据,读取
    		单向: 定向
    			chan <- T,只支持写
    			<- chan T,只读
    
    		定向通道:
    			创建双向的通道: --->(在函数中)限制: 只读、只写操作
    	*/
    	ch7 := make(chan int) //双向,读,写
    	//ch8 := make(chan<- int) //单向,只能写,不能读
    	//ch9 := make(<-chan int)
    
    	//ch7 <- 100
    	//data := ch7
    	//ch8 <- 1000
    	//data := <-ch8  //invalid operation: cannot receive from send-only channel ch8 (variable of type chan<- int)
    
    	//data := <-ch9
    	//ch9 <- 2000  //invalid operation: cannot send to receive-only channel ch9 (variable of type <-chan int)
    
    	go fun1(ch7) //可读,可写(但是到了fun1函数内部只能进行读)
    	//go fun1(ch8) //只写
    
    	data := <-ch7
    	fmt.Println("fun1函数中写出的数据是: ", data)
    
    	go fun2(ch7)
    	//fun2(ch9)
    
    	ch7 <- 200
    	fmt.Println("main...over...")
    }
    
    //该函数,只能操作只写的通道
    func fun1(ch chan<- int) {
    	//在函数内部对于ch7通道,只能写数据不能读取数据.
    	ch <- 100
    	fmt.Println("fun1函数结束...")
    }
    
    //该函数,只能操作只读的通道
    func fun2(ch <-chan int) {
    	data := <-ch
    	fmt.Println("fun2函数,从ch中读取的数据是: ", data)
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57

    image-20221124222811696

    image-20221124223257832

    上次更新: 2024/04/09, 16:48:42
    缓冲通道
    time包中的通道相关函数

    ← 缓冲通道 time包中的通道相关函数→

    最近更新
    01
    AWS NAT-NetWork-Firwalld配置(一)
    04-09
    02
    AWS NAT-NetWork-Firwalld配置(二)
    04-09
    03
    kubernetes部署minio对象存储
    01-18
    更多文章>
    Theme by Vdoing | Copyright © 2019-2024 Bruce Tao Blog Space | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式