:::info 课程导学与学习指南:

    • 你真的搞懂Go底层原理了吗?
    • 你知道协程的底层原理吗?
    • 你知道Channel的底层原理吗?
    • 你知道为什么Go原生就是使用Epoll吗?

    这些问题很重要!因为……

    • 工作中:对工程师底层技术的要求越来越高
    • 面试中:Go高级技术成为了主要考察方向
    • 职业规划:Go语言越来越流行,很多工程师投奔Go

    精通Go,应该怎么学?

    • 精讲高级技术
      • 精讲协程原理,理解协程开发思路
      • 从通信与共享内存的角度,讲解Channel原理
      • 精通Go网络通信原理,提升架构思维
      • 研究Go堆内存结构,优化GC性能
    • 精读官方源码
      • 精读协程源码,理解线程与协程的关系
      • 精度Channel源码,理解Channel工作机理
      • 精度Go网络源码,看看大神如何使用Epoll
    • 大型项目实战
      • 你是否已经厌倦了简单的web实战项目?
      • 通过Go重写Redis,掌握大型中间件的开发经验
      • 不但学习Redis本身的原理,更学习掌握Go的高级技术 :::

        Go的线程模型 Go其实并不是执行协程的,而是执行一个线程,Go在一个线程里面不断的循环,在循环的时候会不断在协程队列中获取协程进行执行,如果遇见比较长的协程,他还会在协程之间进行切换,协程之间的切换需要保存现场,然后在跳回线程循环的开头,把协程当作一个个任务来执行,特别像一个任务队列或者特别像一个线程池的模型。 协程的栈和g0的栈是分开的,那么我们的线程会在协程栈和g0栈来回的跳转执行

    image.png

    分析Channel的概念,Channel就是传输数据的通道,但是我们经过理论分析会发现,Channel需要发送等待队列,还需要接收等待队列,如果Channel里面没有数据,我们就等待接收,如果Channel满了,我们需要等待发送

    image.png

    我们研究了Channel的原理之后,我们会绘制出Channel的实际结构,Channel实际是一个环形的缓存,加上两个队列,在加上Mutex锁,在加上一个状态量。

    image.png

    image.png
    image.png
    image.png
    image.png
    image.png