跳转至

2023寒假参加字节跳动青训营时候的学习记录,报了后端基础班随便混混听几节课。

协程GoRoutine与Go语言的并发编程

本页统计信息
  • 本页约 778 个字, 预计阅读时间 3 分钟。

  • 本页总阅读量

一些八股文

并发和并行的区别: - 并发是指多线程程序在一个CPU上运行 - 并行是在多个CPU上同时运行多个线程

线程和协程 - 协程:用户态,轻量级的线程,栈是MB级别的 - 线程:内核态,一个线程中有多个协程,栈的大小是KB级别的,创建和删除的系统开销比较大

GoRoutine的设计理念

GoRoutine是Go语言中的一种轻量级线程,提倡通过通信来共享内存,而不是通过共享内存来实现通信。如下图所示: GoRoutine在使用的时候直接用go func这样的形式就可以为一个函数创建一个GoRoutine并进行运行

Channel的用法

Channel可以用于实现GoRoutine之间的通信,是一种引用类型,需要用make关键字来进行创建,分为两种: - 无缓冲通道,没有缓冲空间,只能放下一条通信的消息 - 有缓冲通道,有一定的缓冲空间,需要在定义的时候声明

并发安全Lock

Go语言中其实也保留了通过共享内存来实现通信的方式,实际上就是,在sync.Mutex中定义了互斥锁的数据结构可以使用。锁可以一定程度上解决并发安全的问题。

WaitGroup

相比于使用sleep来保证线程不会因为执行结束而被销毁,WaitGroup是一种优雅的实现方式,它实际上维护了一个计数器,并对外提供了三个可调用的方法,分别是: - Add(delta int) 计数器增加delta - Done() 计数器-1,在各种子线程中使用 - Wait() 阻塞直到计数器变成0

Go语言的依赖管理

我们在开发项目的时候,常需要使用已有的Go语言函数库/方法库,这就涉及到对其他包(依赖库)的引入和管理。Go语言的依赖管理主要经历了三个阶段,分别是Go Path,Go Vendor,Go Module

GoPath

GoPath是Go语言开发中的一个环境变量,这个路径对应了一个正在开发的Go语言项目,该路径下主要有三个目录: - bin,项目编译的二进制文件 - pkg,编译的中间产物 - src,是项目源代码所在的文件 但如果我们同事在开放两个Go项目需要依赖同一个库的不同版本,GoPath就会出现冲突

Go Module

Go Module是Go1.16之后的依赖管理方式,解决了Go Path和Go Vendor 可能会出现的版本冲突问题,它的目标是定义版本的规则和管理项目的依赖关系: - 整个项目用go.mod文件来声明项目所需的各种包 - 通过go get或者go mod指令来管理依赖的包

Go语言的测试

颜色主题调整

评论区~

有用的话请给我个star或者follow我的账号!! 非常感谢!!
快来跟我聊天~