Go语言进阶课程笔记 | 青训营笔记

64 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第15天

一、本堂课重点内容

Go语言进阶课程总共包括以下内容:
1.语言进阶
2.依赖管理
3.测试
4.项目实践
通过这些内容的学习,我们能够更好地学习Go语言的实践,开发出可靠的Go语言程序。

二、详细知识点介绍

先弄清楚这些概念。
并行和并发:并行是指两个或者多个事件在同一时刻发生,而并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。Go可以充分发挥多核优势,高效运行。
线程和协程:线程是用户态,轻量级线程,栈MB大小。协程内核态,一个线程运行多个协程,栈KB大小。线程是由操作系统内核调度和管理的,它们是并发执行的基本单位。在操作系统级别上,线程是被动调度的。而协程是由程序员在代码中显式调度的,它们是协作式的并发执行。线程有自己的堆栈和上下文,需要由操作系统分配和管理资源。在多线程环境中,上下文切换是非常昂贵的操作,因为它涉及到内核态和用户态之间的切换。而协程则是在单线程中执行的,它们共享同一个堆栈和上下文,因此上下文切换的成本很低。
Go语言中的channel是一种通信机制,用于在不同的goroutine之间传递数据。一个channel可以看作是一个管道,它可以同时有多个goroutine向其中发送数据,也可以同时有多个goroutine从其中接收数据。通过channel,不同的goroutine可以实现同步通信和数据传递,避免了传统并发编程中需要使用锁、条件变量等机制来实现同步的麻烦。 WaitGroup(等待组)是一种同步机制,用于等待一组goroutine执行完毕。WaitGroup可以帮助我们等待一组goroutine全部执行完毕后再执行后续的操作,避免了在多个goroutine之间使用channel等其他机制进行协调的复杂性。

三、实践练习例子

channel的基本用法:

  1. 创建一个channel ch := make(chan int)
  2. 发送数据到channel ch <- 1
  3. 从channel中接收数据 x := <- ch
  4. 关闭channel close(ch)

WaitGroup的基本用法:

  1. 创建一个WaitGroup var wg sync.WaitGroup
  2. 在每个goroutine执行之前,增加等待组的计数器 wg.Add(1)
  3. 在每个goroutine执行结束时,减少等待组的计数器 wg.Done()
  4. 在主goroutine中等待所有goroutine执行完毕 wg.Wait()

四、课后个人总结

这些机制的使用可以使得并发编程更加简单和直观,但需要注意的是,如果使用不当,可能会引入一些常见的并发编程问题,例如死锁、竞态条件等。因此,在使用这些机制时,需要谨慎考虑设计和实现,确保程序的正确性和性能。

五、引用参考

Go 语言进阶与依赖管理 - 掘金 (juejin.cn)