go语言channel

go语言提供了goroutine来实现并发,go语言也提供了channel来实现并发事件之间的通信。

传统的编程语言通过共享内存来实现通信,当多个线程同时操作一个共享变量的时候,为了使程序达到预期的目的,可能会对变量加锁,这样就会使并发的程序等待,造成程序局部串行。而go的channel的设计理念是通过通信来共享内存。channel是一种特殊的类型,它遵循先进先出的原则,保证数据的收发顺序。go语言中的goroutine可以通过channel来通信。

chan的声明

import "fmt"

func main() {

	var chan1 chan int // 声明int类型的chan

	// chan是引用类型,必须舒适化后才能使用
chan1 = make(chan int, 10)
fmt.Println(chan1) // 0xc000082000
}

chan的声明有一点需要注意,那就是chan必须要用make初始化才能使用

chan的操作

package main

import "fmt"

func main() {

	var chan1 chan int // 声明int类型的chan

	// chan是引用类型,必须舒适化后才能使用
chan1 = make(chan int, 10) // 向chan中传入10
chan1 <- 10 // 从chan中取值
x := <-chan1
fmt.Println(x) // 关闭chan
close(chan1) }

chan如果要使用也必须有一个缓冲区

当chan里面存的数据将缓冲区填满了,别的goroutine在想往chan中传输数据就得等待chan空余的位置,所以当创建一个chan的时候需要合理的给与chan的缓冲

关闭chan使用内置的close函数,关闭后的chan只能读值,不能存值

关闭已经关闭的chan会应发panic,关闭一个nil的chan也会应发panic

多个goroutine操作一个chan和chan的for循环

package main

import (
"fmt"
"sync"
) var wg sync.WaitGroup var chan1 chan interface{} func add_to_chan(c chan interface{}, i int) {
c <- i
wg.Done()
} func main() { // 过个goroutine往chan里添加数据
chan1 = make(chan interface{}, 200)
for i := 1; i < 100; i++ {
wg.Add(1)
go add_to_chan(chan1, i)
} wg.Wait() defer close(chan1)
// chan的for循环
for i := range chan1 {
fmt.Println(i)
} }

单向通道

有时候只想让一个通道只实现取值或者只存值,这时候后就需要用到单向通道了

单向通道一般用于函数的参数

func chan_demo(c1 <-chan interface{}, c2 chan<- interface{}) {

}

如上所示,c1只能为一个取值的通道,而c2是一个存值的通道

最新文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (15) -----第三章 查询之与列表值比较和过滤关联实体
  2. [转]sed命令详解
  3. 深入浅出Java多线程
  4. DES MAC PIN HEX
  5. [jPlayer] HTML5 Audio &amp; Video for jQuery
  6. Python修饰器的函数式编程
  7. berserkJS(大名:狂暴JS / 昵称:疯子JS)
  8. C#异常处理表、类、SQL
  9. C#判断某个类是否派生某个类或是否实现了某个接口
  10. 前端之旅HTML与CSS篇之自己总结的关于居中的方法
  11. 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
  12. 46.Odoo产品分析 (五) – 定制板块(2) – 为业务自定义odoo(1)
  13. 收藏vue技术内幕
  14. clean-room 洁净室软件工程
  15. hdu 3555 Bomb ( 数位DP)
  16. 8I - 吃糖果
  17. 批处理脚本一键重置mysql的root密码
  18. linux常用命令:grep 命令
  19. Javac语法糖之增强for循环
  20. c++犯过的错

热门文章

  1. PDA程序开发的运行配置
  2. 强大的Flutter App升级功能
  3. mysql 如果没有密码 就不能远程连接
  4. Java抽象类和接口的区别及联系
  5. Worktile 进军软件开发与协作的初心与野心
  6. Error: java.net.ConnectException: Call From tuge1/192.168.40.100 to tuge2:8032 failed on connection exception
  7. Cisco 综合配置(三)
  8. The import org.springframework cannot be resolved
  9. Effective python(五):内置模块
  10. Linux &amp; Shell 学习笔记【1/2】