golang基础教程(十六)goroutine 和 channel使用_golang goruntine chan一起使用

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

2、总结:

  1. 主线程是一个物理线程,直接作用在 cpu 上的。是重量级的,非常耗费 cpu 资源。
  2. 协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
  3. Golang 的协程机制是重要的特点,可以轻松的开启上万个协程。其它编程语言的并发机制是一
    般基于线程的,开启过多的线程,资源耗费大,这里就突显 Golang 在并发上的优势了

三、channel使用

1、为什么用channel

异步累加案例:

var s =0

func sum(a int){
s+=a
}
func main() {
for i:=0;i<100;i++{
go sum(i)
}
time.Sleep(time.Second*2)
fmt.Println(s)
}

每次执行出现的结果可能会不一样
问题一、什么时候累加结束?
问题二、协程A累加后的s值会覆盖协程B累加后的s值吗?
如何解决?

  1. 全局变量的互斥锁
  2. 使用管道 channel 来解决
2、全局变量的互斥锁

对s进行加锁,并加入n告诉程序什么时候累加结束。

var (
s = 0
n = 0
lock sync.Mutex
)

func sum(a int){
lock.Lock()
defer lock.Unlock()
s+=a
n++

}
func main() {
for i:=0;i<100;i++{
go sum(i)
}
for{
if n == 100{
break
}
}
fmt.Println(s)
}

似乎这个已经完美解决了所有问题。但是我们使用线程的目的是什么?效率

  1. 加锁了就是要等依次执行,协程A执行完成加锁的代码才能让出资源供协程B执行
  2. 通过全局变量加锁同步来实现通讯,也并不利用多个协程对全局变量的读写操作。

这里就需要使用channel了

3、channel 的基本介绍
  1. channle 本质就是一个数据结构-队列【示意图】
  2. 数据是先进先出【FIFO : first in first out】
  3. 线程安全,多 goroutine 访问时,不需要加锁,就是说 channel 本身就是线程安全的
  4. channel 有类型的,一个 string 的 channel 只能存放 string 类型数据。
  5. 示意图:
    在这里插入图片描述
4、定义/声明 channel

var 变量名 chan 数据类型

举例:

var intChan chan int (intChan 用于存放 int 数据)
var mapChan chan map[int]string (mapChan 用于存放 map[int]string 类型)
var perChan chan Person
var perChan2 chan *Person

channel 是引用类型
channel 必须初始化才能写入数据, 即 make 后才能使用
管道是有类型的,intChan 只能写入 整数 int

func main() {
//演示一下管道的使用
//1. 创建一个可以存放 3 个 int 类型的管道
var intChan chan int
intChan = make(chan int, 3)
//2. 看看 intChan 是什么
fmt.Printf(“intChan 的值=%v intChan 本身的地址=%p\n”, intChan, &intChan)
//3. 向管道写入数据

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
取:vip1024b (备注Go)**
[外链图片转存中…(img-lqrreI6f-1713131413140)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值